Odwróć kolejność wszystkich elementów listy

88

Chciałbym odwrócić kolejność elementów listy w tym kodzie. Zasadniczo jest to zbiór lat od najstarszych do najnowszych i próbuję odwrócić ten wynik.

<?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
źródło

Odpowiedzi:

186

Idąc do tyłu

Jeśli szukasz rozwiązania czysto PHP, możesz po prostu liczyć wstecz na liście, przeglądając ją od początku do końca:

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

$index = count($accounts);

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

Powyższe ustawia $indexcałkowitą liczbę elementów, a następnie rozpoczyna dostęp do nich od tyłu do przodu, zmniejszając wartość indeksu dla następnej iteracji.

Odwracanie tablicy

Możesz również wykorzystać tę array_reversefunkcję do odwrócenia wartości swojej tablicy, umożliwiając dostęp do nich w odwrotnej kolejności:

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

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}
Sampson
źródło
2
@Slawek Jeśli tablica jest już uporządkowana, dlaczego odwrócenie koniecznie miałoby być lepsze niż liczenie przez nią wstecz?
Sampson
1
Idealnie, array_reverse zadziałało! Dziękuję Jonathan i wszystkim innym.
blkedy
4
@JonathanSampson - ponieważ jeśli odwrócisz tablicę przed użyciem jej w pętli, możesz ją po prostu zmienić w przyszłości. Gdy powiążesz logikę pętli z danymi, zmiana kolejności wymusi zmianę również pętli.
Sławek
1
@Slawek Nie jestem pewien, czy śledzę. Liczenie wstecz przez tablicę jest powszechną praktyką i nie wymaga żadnej ostrożności podczas obsługi tablicy w przyszłości, ponieważ w rzeczywistości nie modyfikuje tablicy.
Sampson
1
@Sławek Nie mam tam niezgody. Myślałem, że nie widzę żadnych wskazówek, że użytkownik podąża za jakimkolwiek wzorcem MVC. Oczywiście, jeśli mają kontroler lub model, w wielu przypadkach rozsądniej będzie posortować tam tablicę.
Sampson
33

Lub możesz użyć funkcji array_reverse .

Daniel Figueroa
źródło
21

array_reverse()nie zmienia tablicy źródłowej, ale zwraca nową tablicę. (Zobacz array_reverse().) Więc albo musisz najpierw zapisać nową tablicę albo po prostu użyć funkcji w deklaracji twojej pętli for.

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

Wynik będzie:

c
b
a

Tak więc, aby zaadresować do OP, kod wygląda następująco:

<?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++;
}

Na koniec zgadnę, że $jbył to albo licznik użyty w początkowej próbie uzyskania odwrotnego spaceru $skills_nav, albo sposób na policzenie $skills_navtablicy. Jeśli to pierwsze, należy je usunąć teraz, gdy masz prawidłowe rozwiązanie. Jeśli to drugie, można je zastąpić poza pętlą rozszerzeniem $j = count($skills_nav).

JasonGabler
źródło
7

Jeśli nie masz nic przeciwko zniszczeniu tablicy (lub jej tymczasowej kopii), możesz zrobić:

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

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

produkuje:

raspberry 
apple 
banana 
orange 

Myślę, że to rozwiązanie czyta czystsze niż majstrowanie przy indeksie i jest mniej prawdopodobne, że wprowadzisz błędy obsługi indeksów, ale problem z nim polega na tym, że twój kod prawdopodobnie potrwa nieco dłużej, jeśli będziesz musiał najpierw utworzyć tymczasową kopię tablicy . Majstrowanie przy indeksie prawdopodobnie będzie działać szybciej, ale może się również przydać, jeśli rzeczywiście potrzebujesz odwołać się do indeksu, na przykład:

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

Ale jak widać, z indeksem trzeba bardzo uważać ...

Damian Green
źródło
1
array_popPodejście jest 3 razy wolniej niż array_reversepodejścia: 3v4l.org/3jaTT
Finezja
4

Zakładając, że wystarczy odwrócić tablicę indeksowaną (nie asocjacyjną ani wielowymiarową), wystarczyłaby prosta pętla for :

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

Możesz użyć funkcji usort, aby stworzyć własne reguły sortowania

Sławek
źródło
1

Jeśli tablica jest wypełniana przez zapytanie SQL, rozważ odwrócenie wyniku w MySQL, tj .:

SELECT * FROM model_input order by creation_date desc
Próba Hugo
źródło
-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
źródło
1
array_reverse () nie zmienia tablicy źródłowej, ale zwraca nową tablicę.
Cláudio Silva