Обратный порядок элементов списка 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++;
}
?>
8 ответов:
Пятясь
если вы ищете чисто 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, или a способ подсчета$skills_navмассив. Если первый, он должен быть удален теперь, когда у вас есть правильное решение. Если последний, он может быть заменен, вне цикла, с$j = count($skills_nav).
можно использовать usort функция для создания собственных правил сортировки
Если вы не против уничтожить массив (или его временную копию), вы можете сделать:
$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--; }но, как вы видите, вы должны быть очень осторожны с индексом...
предполагая, что вам просто нужно отменить индексированный массив (не ассоциативный или многомерный) простой цикл было бы достаточно:
$fruits = ['bananas', 'apples', 'pears']; for($i = count($fruits)-1; $i >= 0; $i--) { echo $fruits[$i] . '<br>'; }
Если Ваш массив заполняется через SQL-запрос, рассмотрите возможность изменения результата в 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++; } ?>
Comments