이 의사 코드를 실제 PHP 코드로 번역하도록 도와주세요.
foreach ($arr as $k => $v)
if ( THIS IS NOT THE LAST ELEMENT IN THE ARRAY)
doSomething();
편집 : 배열에 숫자 또는 문자열 키가있을 수 있습니다.
답변
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_last
PHP> = 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';
}
}
답변
이것은 항상 나를위한 트릭입니다
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);
답변
$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
답변
이 간단한 방법이 아닌 이유 :
$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
}
}
답변
나는 이것이 오래되었다는 것을 알고 있으며 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;
}
}
답변
내 솔루션도 아주 간단합니다 ..
$array = [...];
$last = count($array) - 1;
foreach($array as $index => $value)
{
if($index == $last)
// this is last array
else
// this is not last array
}
답변
항목이 숫자로 정렬 된 경우 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
}