Umgekehrt durch ein Array mit PHP - SPL -Lösung in umgekehrt?
Frage
Gibt es in PHP einen Iterator für PLH Reverse -Array? Und wenn nicht, was wäre der beste Weg, um es zu erreichen?
Ich könnte einfach tun
$array = array_reverse($array);
foreach($array as $currentElement) {}
oder
for($i = count($array) - 1; $i >= 0; $i--)
{
}
Aber gibt es einen eleganteren Weg?
Lösung
Es gibt kein ReverseArrayIterator
das zu tun. Du kannst tun
$reverted = new ArrayIterator(array_reverse($data));
Oder machen Sie das zu Ihrem eigenen individuellen Iterator, z. B.
class ReverseArrayIterator extends ArrayIterator
{
public function __construct(array $array)
{
parent::__construct(array_reverse($array));
}
}
Andere Tipps
Hier ist eine Lösung, die das Array nicht kopiert und nicht ändert:
for (end($array); key($array)!==null; prev($array)){
$currentElement = current($array);
// ...
}
Wenn Sie auch einen Verweis auf den aktuellen Schlüssel wünschen:
for (end($array); ($currentKey=key($array))!==null; prev($array)){
$currentElement = current($array);
// ...
}
Dies funktioniert immer, da PHP -Array -Schlüssel niemals null sein kann und ist schneller als jede andere Antwort hier.
$item=end($array);
do {
...
} while ($item=prev($array));
Je nachdem, was Sie versuchen, möchten Sie vielleicht in die SPL -Datenstrukturklassen wie Splstack untersuchen. Splstack implementiert Iterator, ArrayAccess und zählbar, sodass es hauptsächlich wie ein Array verwendet werden kann, aber standardmäßig fährt sein Iterator in Filo -Reihenfolge fort. Ex:
$stack = new SplStack();
$stack[] = 'one';
$stack[] = 'two';
$stack[] = 'three';
foreach ($stack as $item)
{
print "$item\n";
}
Dies wird drucken
three
two
one
Bezogen auf Linepogls Antwort, Ich habe mir diese Funktion ausgedacht:
/**
* 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);
}
}
Verwendungszweck:
foreach(iter_reverse($my_array) as $key => $value) {
// ... do things ...
}
Dies funktioniert auf Arrays und anderen iterablen, ohne zuerst eine Kopie daraus zu machen.
Beachten Sie, dass Sie passieren müssen, wenn Sie die Schlüssel des Arrays erhalten möchten true
als der zweite Parameter zu array_reverse
:
$array = array_reverse($array, true);
foreach ($array as $currentElement) {
// do something here
}
$array = array_reverse($array);
foreach($array as $key => $currentElement) {}
Dies ist ein besserer Weg zu verwenden. Es wird sich auch um Schlüssel kümmern, wenn sie weder sequentiell noch ganzzahlig sind.
Bezogen auf Linepogls Antwort ... Sie können es noch effizienter machen, indem Sie vermeiden current()
Anruf
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
}
Dies könnte ein leistungsfähigerer Weg sein, da es kein neues Array erstellt. Es behandelt auch die leeren Arrays gut.
$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>";