Обратный порядок элементов списка 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++;
}
?>
536   8  
PHP

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

    Ничего не найдено.