通过具有PHP -SPL溶液的阵列反向迭代?
题
PHP中是否有SPL反向阵列迭代器?如果没有,那么实现它的最佳方法是什么?
我可以简单地做
$array = array_reverse($array);
foreach($array as $currentElement) {}
或者
for($i = count($array) - 1; $i >= 0; $i--)
{
}
但是有一种更优雅的方式吗?
解决方案
没有 ReverseArrayIterator
要做到这一点。你可以做
$reverted = new ArrayIterator(array_reverse($data));
或将其放入您自己的自定义迭代器中,例如
class ReverseArrayIterator extends ArrayIterator
{
public function __construct(array $array)
{
parent::__construct(array_reverse($array));
}
}
其他提示
这是一个不复制且未修改数组的解决方案:
for (end($array); key($array)!==null; prev($array)){
$currentElement = current($array);
// ...
}
如果您还需要引用当前密钥:
for (end($array); ($currentKey=key($array))!==null; prev($array)){
$currentElement = current($array);
// ...
}
这始终是因为PHP数组键永远不会为null,并且比此处给出的任何其他答案更快。
$item=end($array);
do {
...
} while ($item=prev($array));
根据您要尝试的工作,您可能需要研究SPL数据结构类,例如Splstack。 Splstack实现了迭代器,阵列和可计数,因此可以像数组一样使用它,但默认情况下,其迭代器按FILO顺序进行。前任:
$stack = new SplStack();
$stack[] = 'one';
$stack[] = 'two';
$stack[] = 'three';
foreach ($stack as $item)
{
print "$item\n";
}
这将打印
three
two
one
基于 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);
}
}
用法:
foreach(iter_reverse($my_array) as $key => $value) {
// ... do things ...
}
这在数组和其他迭代物中起作用,而无需先制作它的副本。
请注意,如果要保留数组的钥匙,则必须通过 true
作为第二个参数 array_reverse
:
$array = array_reverse($array, true);
foreach ($array as $currentElement) {
// do something here
}
$array = array_reverse($array);
foreach($array as $key => $currentElement) {}
这是更好的使用方式。如果它们不是顺序或整数,它也会照顾钥匙。
基于 LinePogl的 答案...您可以通过避免 current()
称呼
for ($value = end($array); ($key = key($array)) !== null; $value = prev($array)) {
// ... do something with $key => $value
}
$array=array(
0 => 0,
'1' => 1,
2 => null,
3 => false
);
$value=end( $array ); // ← value for first iteration
while(($key=key( $array )) !== null) {
echo "key=$key, value=$value\n";
$value=prev( $array ); // ← value for next iteration
}
这可能是一种更具性能的方式,因为它没有构造新数组。它还很好地处理空数组。
$item = end($items);
while($item)
{
...do stuff...
$item = prev($items);
}
$ array1 = array(10,20,30,40,50);
for($i = count($array1) - 1; $i >= 0; $i--)
{
$array2[] = $array1[$i];
}
echo "<pre>";
print_r($array2);
echo "</pre>";
不隶属于 StackOverflow