96

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

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

9 回答 9

201

倒着走

如果您正在寻找一个纯粹的 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);
}
于 2012-05-27T22:04:05.817 回答
34

或者您可以使用array_reverse函数。

于 2012-05-27T22:05:48.123 回答
24

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).

于 2015-10-31T18:25:05.930 回答
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--;
} 

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

于 2017-06-19T02:20:20.053 回答
4

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

于 2012-05-27T22:02:42.937 回答
4

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

$fruits = ['bananas', 'apples', 'pears'];
for($i = count($fruits)-1; $i >= 0; $i--) {
    echo $fruits[$i] . '<br>';
} 
于 2016-11-30T04:47:52.460 回答
1

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

SELECT * FROM model_input order by creation_date desc
于 2016-01-26T14:02:53.367 回答
0

如果您的数组中没有 Boolean false 值,您可以使用基于内部指针函数的下一个代码:

$array = ['banana', 'apple', 'pineapple', 'lemon'];

$value = end($array);
while ($value !== false) {
     // In case you need a key
    $key = key($array);

    // Do something you need to
    echo $key . ' => ' . $value . "\n";

    // Move pointer
    $value = prev($array);
}

此解决方案适用于具有任意键的关联数组,不需要更改现有的或创建新的。

于 2022-02-10T09:13:39.880 回答
-2
<?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++;
    }
?> 
于 2015-07-29T09:33:40.390 回答