使用PHP-SPL解决方案通过数组反向迭代?

Seb*_*itz 21 php spl reverse loops

PHP中是否有SPL反向数组迭代器?如果没有,那么实现它的最佳方法是什么?

我可以干脆做

$array = array_reverse($array);
foreach($array as $currentElement) {}
Run Code Online (Sandbox Code Playgroud)

要么

for($i = count($array) - 1; $i >= 0; $i--)
{

}
Run Code Online (Sandbox Code Playgroud)

但是有更优雅的方式吗?

lin*_*ogl 40

这是一个不复制并且不修改数组的解决方案:

for (end($array); key($array)!==null; prev($array)){
  $currentElement = current($array);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您还想要引用当前键:

for (end($array); ($currentKey=key($array))!==null; prev($array)){
  $currentElement = current($array);
  // ...
}
Run Code Online (Sandbox Code Playgroud)

这总是起作用,因为php数组键永远不能为空,并且比这里给出的任何其他答案更快.

  • 这里最好的答案.谢谢! (3认同)

Abi*_*usX 14

$item=end($array);
do {
...
} while ($item=prev($array));
Run Code Online (Sandbox Code Playgroud)

  • 如果其中一个数组的值为false或NULL或0,该怎么办? (17认同)

rr.*_*rr. 9

根据您要执行的操作,您可能需要查看spl数据结构类,例如SplStack.SplStack实现了Iterator,ArrayAccess和Countable,因此它可以像数组一样使用,但默认情况下,它的迭代器以FILO顺序进行.例如:

$stack = new SplStack();
$stack[] = 'one';
$stack[] = 'two';
$stack[] = 'three';

foreach ($stack as $item)
{
    print "$item\n";
}
Run Code Online (Sandbox Code Playgroud)

这将打印

three
two
one
Run Code Online (Sandbox Code Playgroud)


mpe*_*pen 9

基于linepogl的答案,我想出了这个功能:

/**
 * Iterate an array or other foreach-able without making a copy of it.
 *
 * @param array|\Traversable $iterable
 * @return Generator
 */
function iter_reverse($iterable) {
    for (end($iterable); ($key=key($iterable))!==null; prev($iterable)){
        yield $key => current($iterable);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

foreach(iter_reverse($my_array) as $key => $value) {
    // ... do things ...
}
Run Code Online (Sandbox Code Playgroud)

这适用于数组和其他迭代,而无需先复制它.


Gor*_*don 8

没有ReverseArrayIterator这样做.你可以做

$reverted = new ArrayIterator(array_reverse($data));
Run Code Online (Sandbox Code Playgroud)

或者将它变成你自己的自定义迭代器,例如

class ReverseArrayIterator extends ArrayIterator 
{
    public function __construct(array $array)
    {
        parent::__construct(array_reverse($array));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,array_reverse复制数组元素,因此性能不是很好 (12认同)
  • 我建议做array_reverse($ array,true)以保留数字键的键关联. (6认同)

Rob*_*len 5

请注意,如果要保留数组的键,则必须将true第二个参数传递给array_reverse:

$array = array_reverse($array, true);
foreach ($array as $currentElement) {
    // do something here
}
Run Code Online (Sandbox Code Playgroud)


C.M*_*.M. 5

基于linepogl 的回答......您可以通过避免current()通话来提高效率

for ($value = end($array); ($key = key($array)) !== null; $value = prev($array)) {
     // ... do something with $key => $value
}
Run Code Online (Sandbox Code Playgroud)