Umgekehrte Reihenfolge der einzelnen Listenelemente

83

Ich möchte die Reihenfolge der Listenelemente dieses Codes umkehren. Im Grunde ist es eine Reihe von Jahren, die von den ältesten bis zu den jüngsten reichen, und ich versuche, diese Ausgabe umzukehren.

<?php
    $j=1;     
    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?>  
blkedy
quelle

Antworten:

177

Rückwärts gehen

Wenn Sie nach einer reinen PHP-Lösung suchen, können Sie auch einfach rückwärts durch die Liste zählen und von vorne nach hinten darauf zugreifen:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

$index = count($accounts);

while($index) {
  echo sprintf("<li>%s</li>", $accounts[--$index]);
}

Das Obige wird $indexauf die Gesamtzahl der Elemente festgelegt und beginnt dann, von hinten nach vorne darauf zuzugreifen, wodurch der Indexwert für die nächste Iteration verringert wird.

Array umkehren

Sie können die array_reverseFunktion auch nutzen , um die Werte Ihres Arrays zu invertieren und in umgekehrter Reihenfolge darauf zuzugreifen:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}
Sampson
quelle
2
@Slawek Wenn das Array bereits bestellt ist, warum ist das Umkehren notwendigerweise besser als das Rückwärtszählen?
Sampson
1
Perfekt, das array_reverse hat funktioniert! Danke Jonathan und allen anderen.
Blkedy
4
@JonathanSampson - Wenn Sie das Array vor der Verwendung in einer Schleife umkehren, können Sie es in Zukunft einfach ändern. Wenn Sie die Schleifenlogik mit Daten verbinden, wird durch Ändern der Reihenfolge auch die Schleife geändert.
Slawek
1
@Slawek Ich bin nicht sicher, ob ich folge. Das Rückwärtszählen durch ein Array ist eine gängige Praxis und erfordert keine Vorsicht bei der zukünftigen Handhabung des Arrays, da es das Array nicht tatsächlich ändert.
Sampson
1
@Slawek Ich bin da nicht anderer Meinung. Ich dachte, ich sehe keinen Hinweis darauf, dass der Benutzer einem MVC-Muster folgt. Wenn sie einen Controller oder ein Modell haben, kann es in vielen Fällen klüger sein, das Array dort zu sortieren.
Sampson
33

Oder Sie können die Funktion array_reverse verwenden.

Daniel Figueroa
quelle
20

array_reverse()ändert das Quellarray nicht, gibt jedoch ein neues Array zurück. (Siehe array_reverse().) Sie müssen also entweder zuerst das neue Array speichern oder einfach die Funktion in der Deklaration Ihrer for-Schleife verwenden.

<?php 
    $input = array('a', 'b', 'c');
    foreach (array_reverse($input) as $value) {
        echo $value."\n";
    }
?>

Die Ausgabe wird sein:

c
b
a

Um an OP zu adressieren, lautet der Code:

<?php
    $j=1;     
    foreach ( array_reverse($skills_nav) as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
}

Zuletzt werde ich vermuten, dass dies $jentweder ein Zähler war, der bei einem ersten Versuch verwendet wurde, einen umgekehrten Weg zu finden $skills_nav, oder eine Möglichkeit, das $skills_navArray zu zählen . Wenn erstere, sollte es jetzt entfernt werden, da Sie die richtige Lösung haben. In letzterem Fall kann es außerhalb der Schleife durch a ersetzt werden $j = count($skills_nav).

JasonGabler
quelle
7

Wenn es Ihnen nichts ausmacht, das Array (oder eine temporäre Kopie davon) zu zerstören, können Sie Folgendes tun:

$stack = array("orange", "banana", "apple", "raspberry");

while ($fruit = array_pop($stack)){
    echo $fruit . "\n<br>"; 
}

produziert:

raspberry 
apple 
banana 
orange 

Ich denke, diese Lösung liest sich sauberer als das Fummeln mit einem Index, und es ist weniger wahrscheinlich, dass Sie Fehler bei der Indexbehandlung einführen. Das Problem dabei ist jedoch, dass die Ausführung Ihres Codes wahrscheinlich etwas länger dauert, wenn Sie zuerst eine temporäre Kopie des Arrays erstellen müssen . Das Fummeln mit einem Index läuft wahrscheinlich schneller und kann auch nützlich sein, wenn Sie tatsächlich auf den Index verweisen müssen, wie in:

$stack = array("orange", "banana", "apple", "raspberry");
$index = count($stack) - 1;
while($index > -1){
    echo $stack[$index] ." is in position ". $index . "\n<br>";
    $index--;
} 

Aber wie Sie sehen, müssen Sie mit dem Index sehr vorsichtig sein ...

Damian Green
quelle
1
Der array_popAnsatz ist dreimal langsamer als der array_reverseAnsatz: 3v4l.org/3jaTT
Finesse
4

Angenommen, Sie müssen nur ein indiziertes Array (nicht assoziativ oder mehrdimensional) umkehren, würde eine einfache for-Schleife ausreichen:

$fruits = ['bananas', 'apples', 'pears'];
for($i = count($fruits)-1; $i >= 0; $i--) {
    echo $fruits[$i] . '<br>';
} 
Felix Eve
quelle
3

Mit der Usort- Funktion können Sie eigene Sortierregeln erstellen

Slawek
quelle
1

Wenn Ihr Array über eine SQL-Abfrage gefüllt ist, sollten Sie das Ergebnis in MySQL umkehren, dh:

SELECT * FROM model_input order by creation_date desc
Hugo-Prozess
quelle
-1
<?php
    $j=1; 


      array_reverse($skills_nav);   


    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?> 
user5168728
quelle
1
array_reverse () ändert das Quellarray nicht, gibt jedoch ein neues Array zurück.
Cláudio Silva