Подтвердить что ты не робот

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

Ответ 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++;
    }
?>