Обратный порядок элементов списка foreach

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

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

Solutions Collecting From Web of "Обратный порядок элементов списка foreach"

Прогулка назад

Если вы ищете чисто 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); } 

Или вы можете использовать функцию array_reverse .

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) .

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

Предполагая, что вам просто нужно обратить вспять индексированный массив (не ассоциативный или многомерный), достаточно простого цикла :

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

Если вы не возражаете уничтожить массив (или временную копию его), вы можете сделать:

 $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--; } 

Но, как вы можете видеть, вы должны быть очень осторожны с индексом …

Если ваш массив заполняется SQL Query, рассмотрите возможность изменения результата в MySQL, то есть:

 SELECT * FROM model_input order by creation_date desc 
 <?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++; } ?>