배열 반복 중 현재 요소가 마지막 요소인지 확인


78

이 의사 코드를 실제 PHP 코드로 번역하도록 도와주세요.

 foreach ($arr as $k => $v)
    if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
        doSomething();

편집 : 배열에 숫자 또는 문자열 키가있을 수 있습니다.


6
반복을 위해 for루프를 사용하지 않는 이유는 무엇 count($arr) - 1입니까?
Marcin

1
혼합 키가있는 경우 어떤 키가 마지막 항목인지 어떻게 결정합니까? 배열에 마지막 항목으로 추가하려면 타임 스탬프를 나타내는 데이터가 있어야합니다.
Rasika

마지막에 대한 정의 : 배열의 내부 순서로. foreach 루프가 선택할 마지막 요소를 말하는 것과 동일합니다
shealtiel

답변:


140

PHP의 end ()를 사용할 수 있습니다.

$array = array('a' => 1,'b' => 2,'c' => 3);
$lastElement = end($array);
foreach($array as $k => $v) {
    echo $v . '<br/>';
    if($v == $lastElement) {
         // 'you can do something here as this condition states it just entered last element of an array'; 
    }
}

업데이트 1

@Mijoja가 지적했듯이 배열에 동일한 값이 여러 번 있으면 위의 문제가 발생할 수 있습니다. 아래는 그것에 대한 수정입니다.

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
//point to end of the array
end($array);
//fetch key of the last element of the array.
$lastElementKey = key($array);
//iterate the array
foreach($array as $k => $v) {
    if($k == $lastElementKey) {
        //during array iteration this condition states the last element.
    }
}

업데이트 2

@onteria_의 솔루션이 배열 내부 포인터를 수정하지 않기 때문에 대답 한 것보다 더 나은 것으로 나타났습니다. 그의 대답과 일치하도록 대답을 업데이트하고 있습니다.

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2);
// Get array keys
$arrayKeys = array_keys($array);
// Fetch last array key
$lastArrayKey = array_pop($arrayKeys);
//iterate array
foreach($array as $k => $v) {
    if($k == $lastArrayKey) {
        //during array iteration this condition states the last element.
    }
}

@onteria_ 감사합니다

업데이트 3

@CGundlach가 지적했듯이 array_key_lastPHP> = 7.3을 사용하는 경우 훨씬 더 나은 옵션으로 보이는 PHP 7.3 도입

$array = array('a' => 1,'b' => 2,'c' => 3);
$lastKey = array_key_last($array);
foreach($array as $k => $v) {
    echo $v . '<br/>';
    if($k == $lastKey) {
         // 'you can do something here as this condition states it just entered last element of an array'; 
    }
}

11
배열에 동일한 값이 여러 번 있으면 문제가 발생합니다
Mijoja

1
@IbrahimAzharArmar 방금이 답변을 찾았고 솔루션을 구현하는 동안 PHP 7.3부터 array_key_last내부 포인터에 영향을주지 않고 배열의 마지막 키를 반환하는 함수가 있음을 알았습니다 : secure.php.net/array_key_last . :) 더 많은 솔루션을 단순화하는 것
CGundlach

1
@CGundlach 잘 알고 있습니다. 답변을 업데이트합니다. 감사합니다.
이브라힘 아즈 하르 아르 마르

26

이것은 항상 나를위한 트릭입니다

foreach($array as $key => $value) {
   if (end(array_keys($array)) == $key)
       // Last key reached
}

30/04/15 수정

$last_key = end(array_keys($array));
reset($array);

foreach($array as $key => $value) {
  if ( $key == $last_key)
      // Last key reached
}

@Warren Sergent가 언급 한 E_STRICT 경고를 피하기 위해

$array_keys = array_keys($array);
$last_key = end($array_keys);

훨씬 더 우아하고 쉽습니다! :)
Rafael Moni 2014

이 댓글이 왜 받아 들여지지 않는지 잘 모르겠습니다. 제공된 모든 답변 중에서 가장 간단하고 깔끔하며 대부분의 잠재적 사용 사례 (예 : 연관 열거 형 배열)에서 작동합니다.
Pierce

1
힌트를 드리기 위해 @Pierce :이 답변은 수락 된 답변 3 년 반 후에 답변되었습니다. 배열에 1000 개의 항목이있는 경우 "end"를 1000 번, "array_keys"를 1000 번 호출합니다.
StefanNch 2015

대규모 어레이를 반복하는 경우 분명히 성능 문제가 있습니다. 이 경우 내 제안은 end (array_keys ($ array))를 루프 외부로 이동하는 것입니다. 그러나 반복하기 전에 배열을 재설정해야합니다.
Richard Merchant

현명하게 행동하고 싶다면, 엄격 모드에서 end (array_keys ($ array))는 "변수 만 참조로 전달해야합니다"와 같이 알림을 발생시킵니다.이 문제를 해결하려면 $ array_keys = array_keys ($ array)를 정의하고 호출합니다. $ array_keys 변수에 대한 end ().
Warren Sergent 2015

14
$myarray = array(
  'test1' => 'foo',
  'test2' => 'bar',
  'test3' => 'baz',
  'test4' => 'waldo'
);

$myarray2 = array(
'foo',
'bar',
'baz',
'waldo'
);

// Get the last array_key
$last = array_pop(array_keys($myarray));
foreach($myarray as $key => $value) {
  if($key != $last) {
    echo "$key -> $value\n";
  }
}

// Get the last array_key
$last = array_pop(array_keys($myarray2));
foreach($myarray2 as $key => $value) {
  if($key != $last) {
    echo "$key -> $value\n";
  }
}

array_pop생성 된 임시 배열에서 작동 하므로 array_keys원래 배열을 전혀 수정하지 않습니다.

$ php test.php
test1 -> foo
test2 -> bar
test3 -> baz
0 -> foo
1 -> bar
2 -> baz

루프 외부에서 초기화하는 데 한 줄만 필요하기 때문에 허용되는 답변보다 더 좋습니다.
Jordan Lev

나는 이것이 당신이 반복하려는 배열의 내부 포인터를 변경하지 않기 때문에 받아 들인 대답보다 더 좋습니다.
자율적 '2013-07-01

첫 번째 요소에 대해 동일한 작업을 수행합니다$first = array_shift(array_keys($myarray2));
Luke

2
이것은 E_STRICT에 통지를 생성합니다. 런타임 통지 : 변수 만 참조로 전달되어야합니다
Vigintas Labakojis

이것은 내 대답보다 더 나은 접근 방식으로 보입니다.
이브라힘 아즈 하르 아르 마르

6

이 간단한 방법이 아닌 이유 :

$i = 0; //a counter to track which element we are at
foreach($array as $index => $value) {
    $i++;
    if( $i == sizeof($array) ){
        //we are at the last element of the array
    }
}

2

나는 이것이 오래되었다는 것을 알고 있으며 SPL 반복기를 사용하는 것은 아마도 과잉 일 수 있지만 어쨌든 여기에 또 다른 해결책이 있습니다.

$ary = array(1, 2, 3, 4, 'last');
$ary = new ArrayIterator($ary);
$ary = new CachingIterator($ary);
foreach ($ary as $each) {
    if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator
                            // just to use this `hasNext()` method to see
                            // if this is the last element
       echo $each;
    }
}

1

내 솔루션도 아주 간단합니다 ..

$array = [...];
$last = count($array) - 1;

foreach($array as $index => $value) 
{
     if($index == $last)
        // this is last array
     else
        // this is not last array
}

배열 키가 자동 생성되는 한 이것은 매우 훌륭하고 간단합니다.
Matt Kieran

0

항목이 숫자로 정렬 된 경우 key () 함수를 사용하여 현재 항목의 인덱스를 확인하고 길이와 비교합니다. for 루프 대신 while 루프에서 항목을 순환하려면 next () 또는 prev ()를 사용해야합니다.

$length = sizeOf($arr);
while (key(current($arr)) != $length-1) {
    $v = current($arr); doSomething($v); //do something if not the last item
    next($myArray); //set pointer to next item
}

왜냐하면 내가 검색했을 때 처음 찾은 것이기 때문입니다. 같은 일을하고 더 잘 이해할 수있는 모든 다른 방법을 아는 것이 좋습니다. : D
trusktr

1
숫자가 아니거나 엄격하게 주문되지 않은 항목에는 작동하지 않습니다.
shealtiel

0
$arr = array(1, 'a', 3, 4 => 1, 'b' => 1);
foreach ($arr as $key => $val) {
    echo "{$key} = {$val}" . (end(array_keys($arr))===$key ? '' : ', ');
}
// output: 0 = 1, 1 = a, 2 = 3, 4 = 1, b = 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.