【问题标题】:Reverse order of foreach list itemsforeach 列表项的逆序
【发布时间】:2022-02-10 17:13:39
【问题描述】:

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

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

【问题讨论】:

    标签: php


    【解决方案1】:

    向后走

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

    $accounts = Array(
      '@jonathansampson',
      '@f12devtools',
      '@ieanswers'
    );
    
    $index = count($accounts);
    
    while($index) {
      echo sprintf("<li>%s</li>", $accounts[--$index]);
    }
    

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

    反转数组

    您还可以利用 array_reverse function 反转数组的值,从而以相反的顺序访问它们:

    $accounts = Array(
      '@jonathansampson',
      '@f12devtools',
      '@ieanswers'
    );
    
    foreach ( array_reverse($accounts) as $account ) {
      echo sprintf("<li>%s</li>", $account);
    }
    

    【讨论】:

    • @Slawek 如果数组已经排序,为什么倒数一定比倒数计数要更好
    • @JonathanSampson - 因为如果您在循环使用它之前反转数组,您将来可以简单地更改它。当您将循环逻辑与数据绑定时,更改顺序将强制更改循环。
    • @Slawek 我不确定我是否遵循。通过数组向后计数是一种常见的做法,并且在将来处理数组时不需要任何谨慎,因为它实际上并没有修改数组。
    • @Slawek 我对此没有异议。以为我没有看到任何迹象表明用户正在遵循任何类型的 MVC 模式。当然,如果他们有控制器或模型,在许多情况下,对数组进行排序可能更明智。
    • 对性能来说不是很好,但绝对是更可读的代码:-)
    【解决方案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】:

        如果您不介意销毁数组(或它的临时副本),您可以这样做:

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

        但正如您所见,您必须非常小心索引...

        【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 这不会有效,因为数组已经有序(只需颠倒顺序)。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          SELECT * FROM model_input order by creation_date desc
          

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:
              <?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++;
                  }
              ?> 
              

              【讨论】:

              • array_reverse() 不会改变源数组,而是返回一个新数组。
              猜你喜欢
              • 2010-10-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多