현재 위치: > 최신 기사 목록> foreach 결과에서 end ()를 사용하는 이유는 예상대로하지 않습니까?

foreach 결과에서 end ()를 사용하는 이유는 예상대로하지 않습니까?

M66 2025-06-02

매일 PHP로 프로그래밍 할 때 많은 개발자들이 문제를 일으킬 수 있습니다. Foreach 루프에서는 end ()를 사용하여 배열의 마지막 요소를 얻으려고하지만 결과는 예상대로 아닙니다. 이 질문은 간단 해 보이지만 PHP에 대한 근본적인 행동 이해가 포함됩니다. 이 기사는이 현상을 깊이 분석하고 아이디어를 명확히하고 함정에 빠지지 않도록 도와줍니다.

1. 문제가 다시 나타납니다

먼저 코드를 살펴 보겠습니다.

 $data = ['a', 'b', 'c', 'd'];

foreach ($data as $key => $value) {
    echo "현재 가치: $value\n";
    echo "마지막 요소는입니다: " . end($data) . "\n";
}

다음과 같이 출력을 기대할 수 있습니다.

 현재 가치: a
마지막 요소는입니다: d
현재 가치: b
마지막 요소는입니다: d
...

그러나 실제로, 당신은 때때로 이것이 사실이 아니라는 것을 알게 될 것입니다. end ()key ()를 사용하여 루프에 결합하더라도 요소 d가 아니라 다른 값을 얻을 수 있습니다. 이것은 핵심 질문을 제기합니다.

2. end () 함수는 정확히 무엇을합니까?

PHP의 end () 함수는 배열의 "마지막 값"을 직접 취하지 않습니다. 그 기능은 다음과 같습니다.

배열의 내부 포인터를 마지막 요소로 이동하고 해당 요소의 값을 반환합니다.

이 문장의 초점은 " 포인터 움직임 "입니다. "포인터"는 PHP 배열 내부에서 유지되며 Next () , prev () , rest ()end () 의 사용은이 포인터의 위치에 영향을 미칩니다. 다시 말해, end ()는 부작용이 있습니다.

3. Foreach와 내부 포인터의 관계

Foreach는 PHP의 언어 구조입니다. 배열 위로 반복 할 때이 "내부 포인터"를 사용하지 않습니다. 즉, 다음과 같습니다.

  • Foreach를 사용하여 $ 이상 데이터를 반복하고 PHP는 백그라운드에서 사본 또는 스냅 샷을 만듭니다.

  • Foreach 에서 end ()를 사용하기 때문에 Foreach 의 반복적 인 동작에 영향을 미치지 않습니다.

  • 그러나 foreach 에서 end ()를 사용하면 원래 배열의 내부 포인터가 변경됩니다.

이 "포인터는 서로를 방해하지 않습니다"는 foreach 에서 end ()를 호출하게하지만 key ()current () 와 같은 다른 함수와 함께 사용될 때 불일치 또는 논리적 오류도 발생합니다.

IV. 실제 사례

다음 코드는 혼란스러운 시나리오를 보여줍니다.

 $urls = [
    'http://m66.net/page1',
    'http://m66.net/page2',
    'http://m66.net/page3',
];

foreach ($urls as $url) {
    if ($url === end($urls)) {
        echo "이것은 마지막 페이지입니다: $url\n";
    } else {
        echo "처리: $url\n";
    }
}

이 코드는 그것이 마지막 URL인지 알 수 있다고 생각할 수 있습니다. 실제로, end ()가 배열 포인터를 마지막 요소로 이동시키기 때문에 항상 첫 번째 것이 "마지막 것"이라고 결정할 확률이 높지만 루프의 내부 $ URL은 스냅 샷 사본이며 판단 논리는 유효하지 않습니다 .

5. 그것을하는 올바른 방법

Foreach 의 마지막 요소인지 확인하려면 몇 가지 권장 방법이 있습니다.

방법 1 : for 루프를 사용하십시오

 $count = count($urls);
for ($i = 0; $i < $count; $i++) {
    $url = $urls[$i];
    if ($i === $count - 1) {
        echo "이것은 마지막 페이지입니다: $url\n";
    } else {
        echo "처리: $url\n";
    }
}

방법 2 : foreach + 임시 변수

 $last = end($urls);
reset($urls); // 나중에 통과해야한다면
foreach ($urls as $url) {
    if ($url === $last) {
        echo "이것은 마지막 페이지입니다: $url\n";
    } else {
        echo "처리: $url\n";
    }
}

이 방법은 괜찮지 만 알아야합니다. 배열에 중복 값이 ​​있으면 두 URL이 동일합니다.

방법 3 : 키 비교 사용 (연관 배열의 경우)

 end($urls);
$lastKey = key($urls);
reset($urls);
foreach ($urls as $key => $url) {
    if ($key === $lastKey) {
        echo "마지막 항목: $url\n";
    } else {
        echo "처리: $url\n";
    }
}

이것은 더 안전한 방법이며, 연관 배열 또는 배열 값이 반복 될 수있는 경우에 권장됩니다.

6. 결론

Foreach 루프에서 end ()를 사용하는 것은 PHP의 배열 포인터 메커니즘과 맞춤형 반복 메커니즘이 분리되어 있기 때문에 예상대로 작동하지 않을 수 있습니다. 이를 이해하면 잠재적 인 버그와 논리적 오류를 피할 수 있습니다.

일반적으로 end () 는 부작용이있는 함수입니다 . 마지막 요소인지 판단 해야하는 경우 계산, 임시 변수 또는 주요 비교와 같은보다 신뢰할 수있는 방법을 사용해야합니다.

이 기사가 PHP 의이 "멋진"행동을 더 잘 이해하는 데 도움이되기를 바랍니다.