Зворотний порядок елементів списку для кожного


84

Я хотів би змінити порядок елементів списку цього коду. В основному це набір років, що переходять від найстарішого до недавнього, і я намагаюся змінити цей результат.

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

Відповіді:


180

Ходьба назад

Якщо ви шукаєте чисто PHP-рішення, ви також можете просто перерахувати назад список, перейти до нього спереду:

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

$index = count($accounts);

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

Вищезазначене встановлює $indexзагальну кількість елементів, а потім починає звертатися до них ззаду, зменшуючи значення індексу для наступної ітерації.

Реверсування масиву

Ви також можете використати array_reverseфункцію для інвертування значень вашого масиву, дозволяючи отримати доступ до них у зворотному порядку:

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

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}

2
@Slawek Якщо масив уже впорядкований, чому реверс повинен бути краще, ніж вважати його назад?
Семпсон

1
Прекрасно, array_reverse спрацював! Дякую Джонатану та всім іншим.
blkedy

4
@JonathanSampson - адже якщо ви повернете масив назад, перш ніж використовувати його у циклі, ви можете просто змінити його в майбутньому. Коли ви зв'язуєте логіку циклу з даними, зміна порядку змусить змінити також цикл.
Славек,

1
@Slawek Я не впевнений, що підписуюсь. Зворотний відлік через масив є звичайною практикою і не вимагає обережності при обробці масиву в майбутньому, оскільки він фактично не змінює масив.
Семпсон,

1
@Slawek Я там не в розбіжності. Думав, що я не бачу жодних ознак того, що користувач дотримується будь-якого шаблону MVC. Звичайно, якщо у них є контролер або модель, може бути розумніше сортувати там масив у багатьох випадках.
Семпсон


20

array_reverse()не змінює вихідний масив, а повертає новий масив. (Див array_reverse().). Тому вам або потрібно спочатку зберегти новий масив, або просто використовувати функцію в оголошенні циклу for.

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

Результатом буде:

c
b
a

Отже, щоб звернутися до OP, код стає:

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

Нарешті, я збираюся здогадатися, що це $jбув або лічильник, який використовувався в початковій спробі отримати зворотну прогулянку $skills_nav, або спосіб підрахунку $skills_navмасиву. Якщо перше, його слід видалити зараз, коли у вас є правильне рішення. Якщо останнє, його можна замінити поза циклом на $j = count($skills_nav).


7

Якщо ви не проти знищити масив (або його тимчасову копію), ви можете зробити:

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

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

виробляє:

raspberry 
apple 
banana 
orange 

Я вважаю, що це рішення читається чистіше, ніж возиння з індексом, і ви рідше призводите до помилок при обробці індексу, але проблема в тому, що ваш код, швидше за все, займе трохи більше часу, якщо спочатку вам доведеться створити тимчасову копію масиву . Спілкування з індексом, швидше за все, працюватиме швидше, і це також може стати в нагоді, якщо вам справді потрібно буде посилатися на індекс, як у:

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

Але, як бачите, ви повинні бути дуже обережними з покажчиком ...


1
array_popПідхід в 3 раз повільніше , ніж array_reverseпідхід: 3v4l.org/3jaTT
Finesse

4

Припускаючи, що вам просто потрібно змінити індексований масив (не асоціативний чи багатовимірний), простого циклу for буде достатньо:

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

3

Ви можете використовувати функцію usort для створення власних правил сортування


1

Якщо ваш масив заповнюється за допомогою SQL-запиту, розгляньте можливість зміни результату в MySQL, тобто:

SELECT * FROM model_input order by creation_date desc

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

1
array_reverse () не змінює вихідний масив, а повертає новий масив.
Cláudio Silva
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.