첫 번째 또는 마지막을 제외한 모든 요소에 대해 무언가를 수행해야하고 배열에 하나 이상의 요소가있는 경우에만 다음 솔루션을 선호합니다.
나는 위의 많은 솔루션이 있고 내 전에 몇 달 / 1 년을 게시 한 것을 알고 있지만 이것은 그 자체로 상당히 우아하다고 느낍니다. 모든 루프 검사는 숫자 "i = (count-1)"검사와 달리 부울 검사이므로 오버 헤드를 줄일 수 있습니다.
루프의 구조는 어색 할 수 있지만 HTML 테이블 태그에서 thead (시작), tfoot (종료), tbody (현재)의 순서와 비교할 수 있습니다.
$first = true;
foreach($array as $key => $value) {
if ($first) {
$first = false;
// Do what you want to do before the first element
echo "List of key, value pairs:\n";
} else {
// Do what you want to do at the end of every element
// except the last, assuming the list has more than one element
echo "\n";
}
// Do what you want to do for the current element
echo $key . ' => ' . $value;
}
예를 들어, 웹 개발 용어 에서 정렬되지 않은 목록 (ul) 의 마지막 요소를 제외한 모든 요소에 테두리 아래쪽 을 추가하려는 경우 첫 번째 요소를 제외한 모든 요소에 테두리 위쪽을 추가 할 수 있습니다 (CSS : IE7 +에서 지원되는 첫 번째 자식 및 Firefox / Webkit은이 논리를 지원하지만 : last-child는 IE7에서 지원되지 않습니다).
중첩 루프마다 $ first 변수를 자유롭게 재사용 할 수 있으며 첫 번째 반복의 첫 번째 프로세스 중에 모든 루프가 $ first를 거짓으로 만들기 때문에 문제가 발생하지 않습니다. 따라서 중단 / 예외로 인해 문제가 발생하지 않습니다. .
$first = true;
foreach($array as $key => $subArray) {
if ($first) {
$string = "List of key => value array pairs:\n";
$first = false;
} else {
echo "\n";
}
$string .= $key . '=>(';
$first = true;
foreach($subArray as $key => $value) {
if ($first) {
$first = false;
} else {
$string .= ', ';
}
$string .= $key . '=>' . $value;
}
$string .= ')';
}
echo $string;
출력 예 :
List of key => value array pairs:
key1=>(v1_key1=>v1_val1, v1_key2=>v1_val2)
key2=>(v2_key1=>v2_val1, v2_key2=>v2_val2, v2_key3=>v2_val3)
key3=>(v3_key1=>v3_val1)