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?

War es hilfreich?

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>";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top