foreach列表项的反向顺序

blk*_*edy 72 php

我想颠倒此代码列表项的顺序.基本上它是从最旧到最近的一组年,我试图扭转这一输出.

<?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++;
    }
?>  
Run Code Online (Sandbox Code Playgroud)

Sam*_*son 149

向后走

如果您正在寻找一个纯粹的PHP解决方案,您也可以简单地在列表中向后计数,从前到后访问它:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

$index = count($accounts);

while($index) {
  echo sprintf("<li>%s</li>", $accounts[--$index]);
}
Run Code Online (Sandbox Code Playgroud)

以上设置$index为元素总数,然后开始从前到后访问它们,减少下一次迭代的索引值.

反转数组

您还可以利用该array_reverse函数反转数组的值,允许您以相反的顺序访问它们:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}
Run Code Online (Sandbox Code Playgroud)

  • @JonathanSampson - 因为如果你在循环中使用它之前反转数组,你可以在以后简单地改变它.将循环逻辑与数据绑定时,更改顺序将强制更改循环. (3认同)
  • @Slawek如果已经对数组进行了排序,为什么反转比倒计数要好得多? (2认同)
  • 对性能来说不是很好,但代码绝对更可读:-) (2认同)

Dan*_*roa 30

或者您可以使用array_reverse函数.


Jas*_*ler 13

array_reverse()不会更改源数组,但会返回一个新数组.(请参阅array_reverse().)因此,您需要先存储新数组,或者只需在for循环声明中使用函数.

<?php 
    $input = array('a', 'b', 'c');
    foreach (array_reverse($input) as $value) {
        echo $value."\n";
    }
?>
Run Code Online (Sandbox Code Playgroud)

输出将是:

c
b
a
Run Code Online (Sandbox Code Playgroud)

因此,为了解决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++;
}
Run Code Online (Sandbox Code Playgroud)

最后,我要猜测这$j是一个用于初步尝试获得反向行走的计数器$skills_nav,或者是计算$skills_nav数组的方法.如果是前者,那么现在应该删除它,因为你有正确的解决方案.如果是后者,它可以在循环外部用a替换$j = count($skills_nav).


Dam*_*een 7

如果您不介意销毁数组(或它的临时副本),您可以执行以下操作:

$stack = array("orange", "banana", "apple", "raspberry");

while ($fruit = array_pop($stack)){
    echo $fruit . "\n<br>"; 
}
Run Code Online (Sandbox Code Playgroud)

产生:

raspberry 
apple 
banana 
orange 
Run Code Online (Sandbox Code Playgroud)

我认为这个解决方案读起来比摆弄索引更清晰,你不太可能引入索引处理错误,但它的问题是如果你必须先创建数组的临时副本,你的代码运行时间可能会稍长一些. 摆弄索引可能会运行得更快,如果您确实需要引用索引,它也可能派上用场,如下所示:

$stack = array("orange", "banana", "apple", "raspberry");
$index = count($stack) - 1;
while($index > -1){
    echo $stack[$index] ." is in position ". $index . "\n<br>";
    $index--;
} 
Run Code Online (Sandbox Code Playgroud)

但是正如你所看到的,你必须非常小心索引......

  • `array_pop` 方法比 `array_reverse` 方法慢 3 倍:https://3v4l.org/3jaTT (2认同)

Sla*_*wek 5

您可以使用usort函数创建自己的排序规则


Fel*_*Eve 5

假设您只需要反转索引数组(不是关联或多维),一个简单的for 循环就足够了:

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