Обратный порядок элементов списка 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++;
}
?>
Ответы
Ответ 1
Прогулка назад
Если вы ищете чисто 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
Или вы можете использовать функцию array_reverse.
Ответ 3
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)
.
Ответ 4
Вы можете использовать usort для создания собственных правил сортировки
Ответ 5
Предполагая, что вам просто нужно отменить индексированный массив (не ассоциативный или многомерный), достаточно простого для цикла:
$fruits = ['bananas', 'apples', 'pears'];
for($i = count($fruits)-1; $i >= 0; $i--) {
echo $fruits[$i] . '<br>';
}
Ответ 6
Если вы не возражаете уничтожить массив (или временную копию его), вы можете сделать:
$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--;
}
Но, как вы можете видеть, вы должны быть очень осторожны с индексом...
Ответ 7
Если ваш массив заполняется SQL Query, рассмотрите вопрос об изменении результата в MySQL, а именно:
SELECT * FROM model_input order by creation_date desc
Ответ 8
<?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++;
}
?>