매일 PHP로 프로그래밍 할 때 많은 개발자들이 문제를 일으킬 수 있습니다. Foreach 루프에서는 end ()를 사용하여 배열의 마지막 요소를 얻으려고하지만 결과는 예상대로 아닙니다. 이 질문은 간단 해 보이지만 PHP에 대한 근본적인 행동 이해가 포함됩니다. 이 기사는이 현상을 깊이 분석하고 아이디어를 명확히하고 함정에 빠지지 않도록 도와줍니다.
먼저 코드를 살펴 보겠습니다.
$data = ['a', 'b', 'c', 'd'];
foreach ($data as $key => $value) {
echo "현재 가치: $value\n";
echo "마지막 요소는입니다: " . end($data) . "\n";
}
다음과 같이 출력을 기대할 수 있습니다.
현재 가치: a
마지막 요소는입니다: d
현재 가치: b
마지막 요소는입니다: d
...
그러나 실제로, 당신은 때때로 이것이 사실이 아니라는 것을 알게 될 것입니다. end () 와 key ()를 사용하여 루프에 결합하더라도 요소 d가 아니라 다른 값을 얻을 수 있습니다. 이것은 핵심 질문을 제기합니다.
PHP의 end () 함수는 배열의 "마지막 값"을 직접 취하지 않습니다. 그 기능은 다음과 같습니다.
배열의 내부 포인터를 마지막 요소로 이동하고 해당 요소의 값을 반환합니다.
이 문장의 초점은 " 포인터 움직임 "입니다. "포인터"는 PHP 배열 내부에서 유지되며 Next () , prev () , rest () 및 end () 의 사용은이 포인터의 위치에 영향을 미칩니다. 다시 말해, end ()는 부작용이 있습니다.
Foreach는 PHP의 언어 구조입니다. 배열 위로 반복 할 때이 "내부 포인터"를 사용하지 않습니다. 즉, 다음과 같습니다.
Foreach를 사용하여 $ 이상 데이터를 반복하고 PHP는 백그라운드에서 사본 또는 스냅 샷을 만듭니다.
Foreach 에서 end ()를 사용하기 때문에 Foreach 의 반복적 인 동작에 영향을 미치지 않습니다.
그러나 foreach 에서 end ()를 사용하면 원래 배열의 내부 포인터가 변경됩니다.
이 "포인터는 서로를 방해하지 않습니다"는 foreach 에서 end ()를 호출하게하지만 key () 및 current () 와 같은 다른 함수와 함께 사용될 때 불일치 또는 논리적 오류도 발생합니다.
다음 코드는 혼란스러운 시나리오를 보여줍니다.
$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은 스냅 샷 사본이며 판단 논리는 유효하지 않습니다 .
Foreach 의 마지막 요소인지 확인하려면 몇 가지 권장 방법이 있습니다.
$count = count($urls);
for ($i = 0; $i < $count; $i++) {
$url = $urls[$i];
if ($i === $count - 1) {
echo "이것은 마지막 페이지입니다: $url\n";
} else {
echo "처리: $url\n";
}
}
$last = end($urls);
reset($urls); // 나중에 통과해야한다면
foreach ($urls as $url) {
if ($url === $last) {
echo "이것은 마지막 페이지입니다: $url\n";
} else {
echo "처리: $url\n";
}
}
이 방법은 괜찮지 만 알아야합니다. 배열에 중복 값이 있으면 두 URL이 동일합니다.
end($urls);
$lastKey = key($urls);
reset($urls);
foreach ($urls as $key => $url) {
if ($key === $lastKey) {
echo "마지막 항목: $url\n";
} else {
echo "처리: $url\n";
}
}
이것은 더 안전한 방법이며, 연관 배열 또는 배열 값이 반복 될 수있는 경우에 권장됩니다.
Foreach 루프에서 end ()를 사용하는 것은 PHP의 배열 포인터 메커니즘과 맞춤형 반복 메커니즘이 분리되어 있기 때문에 예상대로 작동하지 않을 수 있습니다. 이를 이해하면 잠재적 인 버그와 논리적 오류를 피할 수 있습니다.
일반적으로 end () 는 부작용이있는 함수입니다 . 마지막 요소인지 판단 해야하는 경우 계산, 임시 변수 또는 주요 비교와 같은보다 신뢰할 수있는 방법을 사용해야합니다.
이 기사가 PHP 의이 "멋진"행동을 더 잘 이해하는 데 도움이되기를 바랍니다.