foreach列表项的倒序


83

我想颠倒此代码的列表项的顺序。基本上,这是从最旧的到最近的几年时间,我正在尝试反转该输出。

<?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++;
    }
?>  

Answers:


177

向后走

如果您正在寻找纯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
@Slawek如果数组已经排序,为什么反转比遍历它更好呢?
桑普森

1
完美,array_reverse可以工作!谢谢乔纳森和其他所有人。
blkedy 2012年

4
@JonathanSampson-因为如果您在循环使用数组之前反转数组,则以后可以更改它。当您将循环逻辑与数据绑定时,更改顺序将强制同时更改循环。
Slawek'5

1
@Slawek我不确定我是否遵循。遍历数组是一种常见的做法,将来在处理数组时不需要任何注意,因为它实际上不会修改数组。
桑普森

1
@Slawek我在那里没有意见分歧。以为我没有看到任何迹象表明用户正在遵循任何一种MVC模式。当然,如果它们具有控制器或模型,则在许多情况下对数组进行排序可能更明智。
桑普森


20

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)


7

如果您不介意破坏阵列(或其临时副本),则可以执行以下操作:

$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--;
} 

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


1
array_pop方法比array_reverse方法慢3倍:3v4l.org/3jaTT
Finesse,

4

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

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


1

如果您的数组是通过SQL查询填充的,请考虑在MySQL中反转结果,即:

SELECT * FROM model_input order by creation_date desc

-1
<?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++;
    }
?> 

1
array_reverse()不会更改源数组,但会返回一个新数组。
克拉迪奥·席尔瓦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.