【问题标题】:Checking during array iteration, if the current element is the last element在数组迭代期间检查当前元素是否是最后一个元素
【发布时间】:2011-08-30 19:51:23
【问题描述】:

请帮我把这个伪代码翻译成真正的php代码:

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

编辑:数组可能有数字或字符串键

【问题讨论】:

  • 为什么不使用for 循环进行count($arr) - 1 迭代?
  • 如果你有混合键,你如何确定哪个键是最后一项?如果您希望它作为添加到数组中的最后一项,那么应该有一些数据来指示时间戳。
  • last 的定义:按数组的内部顺序。这与说 foreach 循环将选择的最后一个元素相同

标签: php arrays


【解决方案1】:

你可以使用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 指出的那样,PHP 7.3 引入了array_key_last,如果您使用的是 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'; 
    }
}

【讨论】:

  • 如果数组中有多次相同的值会有问题
  • @IbrahimAzharArmar 刚刚找到了这个答案,在实现您的解决方案时,我注意到自 PHP 7.3 以来现在有函数 array_key_last,它还返回数组的最后一个键而不影响内部指针:@ 987654322@。将进一步简化您的解决方案:)
  • @CGundlach 很高兴知道。将更新答案。谢谢。
【解决方案2】:
$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

【讨论】:

  • 我比接受的答案更喜欢这个,因为它只需要一行在循环外进行初始化。
  • 我比接受的答案更喜欢这个,因为它不会改变你要循环的数组的内部指针。
  • 对第一个元素做同样的事情$first = array_shift(array_keys($myarray2));
  • 这会在 E_STRICT 中产生一个通知:运行时通知:只有变量应该通过引用传递
  • 这似乎比我的答案更好,更新我的答案。
【解决方案3】:

如果项目是按数字排序的,则使用 key() 函数确定当前项目的索引并将其与长度进行比较。您必须使用 next() 或 prev() 在 while 循环而不是 for 循环中循环遍历项目:

$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
  • 不适用于非数字或非严格排序的项目
【解决方案4】:
$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

【讨论】:

    【解决方案5】:

    这对我来说总是有用的

    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);
    

    【讨论】:

    • 更加优雅和简单! :)
    • 我不确定为什么这个评论不是被接受的答案。它是所有提供的答案中最简单/最干净的答案,适用于绝大多数潜在用例(即关联 枚举数组)。
    • @Pierce 给你一个提示:这是在接受答案后 3 年半回答的,另外,如果你的数组中有 1000 个项目,你将调用“end”1000 次和“ array_keys" 1000 次。
    • 如果您正在迭代一个大型数组,这显然会出现性能问题。在这种情况下,我的建议是将 end(array_keys($array)) 移到循环之外。但请确保在迭代之前重置数组。
    • 如果你想学究气,在严格模式下, end(array_keys($array)) 会引起一个通知,因为“只有变量应该通过引用传递” - 要纠正这个问题,定义 $array_keys = array_keys($array) 并在 $array_keys 变量上调用 end()。
    【解决方案6】:

    我的解决方案,也很简单..

    $array = [...];
    $last = count($array) - 1;
    
    foreach($array as $index => $value) 
    {
         if($index == $last)
            // this is last array
         else
            // this is not last array
    }
    

    【讨论】:

    • 这很简单,只要你的数组键是自动生成的。
    【解决方案7】:

    我知道这是旧的,使用 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;
        }
    }
    

    【讨论】:

      【解决方案8】:

      为什么不用这个非常简单的方法:

      $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
          }
      }
      

      【讨论】:

        【解决方案9】:

        成功了

        $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'; 
            }
        }
        

        【讨论】:

        • 接受的答案几年前对此功能进行了更新,因此该评论并未真正提供任何新信息。
        【解决方案10】:

        使用array_keys 函数获取键的简单方法,并且只获取反向数组的第一个[0],即最后一个键

        $array = array('a' => 1,'b' => 2,'c' => 3);
        $last_key = array_keys(array_reverse($array, true))[0];
        foreach($array as $key => $value) {
           if ($last_key !== $key)
               // THIS IS NOT THE LAST ELEMENT IN THE ARRAY doSomething();
        }
        

        注意array_reverse 反转数组接受两个参数,第一个数组我们想要反转,第二个参数 true,用于反转数组并保留键的顺序

        【讨论】:

          猜你喜欢
          • 2023-03-25
          • 2022-07-06
          • 1970-01-01
          • 1970-01-01
          • 2016-02-12
          • 1970-01-01
          • 2019-04-08
          • 2019-04-03
          • 2017-03-15
          相关资源
          最近更新 更多