[php] PHP에서 foreach 루프를 사용하는 동안 배열의 마지막 요소 찾기

일부 매개 변수를 사용하여 SQL 쿼리 작성자를 작성 중입니다. Java에서는 배열 길이로 현재 배열 위치를 확인하면 for 루프 내부에서 배열의 마지막 요소를 매우 쉽게 감지 할 수 있습니다.

for(int i=0; i< arr.length;i++){
     boolean isLastElem = i== (arr.length -1) ? true : false;
}

PHP에서는 배열에 액세스하기 위해 정수가 아닌 인덱스를 가지고 있습니다. 따라서 foreach 루프를 사용하여 배열을 반복해야합니다. 이것은 어떤 결정을 내려야 할 때 문제가됩니다 (제 경우에는 쿼리를 작성하는 동안 추가 또는 매개 변수).

이 작업을 수행하는 표준 방법이 있어야합니다.

PHP에서 어떻게 해결합니까?



답변

다음과 같이 원하는 것처럼 들립니다.

$numItems = count($arr);
$i = 0;
foreach($arr as $key=>$value) {
  if(++$i === $numItems) {
    echo "last index!";
  }
}    

즉, foreachPHP에서 사용하는 “배열”을 반복하지는 않습니다 .


답변

배열의 마지막 키 값을 사용 end(array_keys($array))하여 현재 키와 비교할 수 있습니다.

$last_key = end(array_keys($array));
foreach ($array as $key => $value) {
    if ($key == $last_key) {
        // last element
    } else {
        // not last element
    }
}


답변

왜 그렇게 복잡한가?

foreach($input as $key => $value) {
    $ret .= "$value";
    if (next($input)==true) $ret .= ",";
}

마지막 값을 제외한 모든 값 뒤에을 추가합니다!


답변

toEnd가 0에 도달하면 루프의 마지막 반복에 있음을 의미합니다.

$toEnd = count($arr);
foreach($arr as $key=>$value) {
  if (0 === --$toEnd) {
    echo "last index! $value";
  }
}

마지막 값은 루프 후에도 계속 사용할 수 있으므로 루프 후에 더 많은 것을 위해 사용하려는 경우 더 좋습니다.

foreach($arr as $key=>$value) {
  //something
}
echo "last index! $key => $value";

마지막 값을 특수 내부 루프로 취급하지 않으려는 경우. 배열이 큰 경우 더 빠릅니다. 동일한 범위 내에서 루프 후 배열을 재사용하는 경우 먼저 배열을 “복사”해야합니다.

//If you use this in a large global code without namespaces or functions then you can copy the array like this:
//$array = $originalArrayName; //uncomment to copy an array you may use after this loop

//end($array); $lastKey = key($array); //uncomment if you use the keys
$lastValue = array_pop($array);

//do something special with the last value here before you process all the others?
echo "Last is $lastValue", "\n";

foreach ($array as $key => $value) {
    //do something with all values before the last value
    echo "All except last value: $value", "\n";
}

//do something special with the last value here after you process all the others?
echo "Last is $lastValue", "\n";

그리고 원래 질문에 대답하기 위해 “제 경우에는 쿼리를 작성하는 동안 매개 변수를 추가하거나 추가 할 수 있습니다”; 이렇게하면 모든 값을 반복 한 다음 첫 번째 값 앞이나 마지막 값이 아닌 “와”사이에 “와”가있는 문자열로 결합합니다.

$params = [];
foreach ($array as $value) {
    $params[] = doSomething($value);
}
$parameters = implode(" and ", $params);


답변

이미 많은 답변이 있지만 특히 표준 방법으로 요청 된 경우 반복자를 살펴볼 가치가 있습니다.

$arr = range(1, 3);

$it = new CachingIterator(new ArrayIterator($arr));
foreach($it as $key => $value)
{
  if (!$it->hasNext()) echo 'Last:';
  echo $value, "\n";
}

다른 경우에도 더 유연하게 작동하는 것을 찾을 수 있습니다.


답변

한 가지 방법은 반복자가 가지고 있는지 감지하는 것 next입니다. 반복자에 다음에 연결되지 않은 경우 마지막 루프 상태임을 의미합니다.

foreach ($some_array as $element) {
    if(!next($some_array)) {
         // This is the last $element
    }
}


답변

따라서 배열에 고유 한 배열 값이 있으면 마지막 반복을 결정하는 것이 쉽지 않습니다.

foreach($array as $element) {
    if ($element === end($array))
        echo 'LAST ELEMENT!';
}

보시다시피, 마지막 요소가 배열에 한 번만 나타나는 경우 작동합니다. 그렇지 않으면 잘못된 경보가 발생합니다. 그것은 당신이 키를 비교할 필요는 없습니다 (확실히 독특합니다).

foreach($array as $key => $element) {
    end($array);
    if ($key === key($array))
        echo 'LAST ELEMENT!';
}

또한 엄격한 coparision 연산자를 참고하십시오.이 경우에는 매우 중요합니다.