【问题标题】:How to sort multiple arrays in PHP如何在PHP中对多个数组进行排序
【发布时间】:2011-02-11 09:38:39
【问题描述】:

我编写了一个脚本来生成一个数据数组,但现在想按分数顺序显示。数组输出如下;

[display_name] => Array
    (
        [0] => ACT_Web_Designs
        [1] => user1_design
        [2] => user2_design
    )

[proffesion] => Array
    (
        [0] => Web Developer
        [1] => web developer
        [2] => Web Developer
    )

[score] => Array
    (
        [0] => 15
        [1] => 6
        [2] => 15
    )

[img] => Array
    (
        [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic
        [1] => 
        [2] => 
    )

所以简而言之,我希望将其转换如下;

    [display_name] => Array
    (
        [0] => ACT_Web_Designs
        [1] => user2_design
        [2] => user1_design
    )

[proffesion] => Array
    (
        [0] => Web Developer
        [1] => web developer
        [2] => Web Developer
    )

[score] => Array
    (
        [0] => 15
        [1] => 15
        [2] => 6
    )

[img] => Array
    (
        [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic
        [1] => 
        [2] => 
    )

我一直在查看 asort() 但无法正常工作。任何帮助将不胜感激。

【问题讨论】:

  • 是数据库中的数据吗?也许您可以在将数据放入数组之前对其进行排序?
  • 是的,但结果是针对目录/搜索引擎的,因此结果基于从查询中获取相关结果的最有效方式
  • 这是一个专业,一个f,两个s
  • 你现在让我思考。看到分数是在检索结果后计算的,我认为 cron 工作会更好,感谢您的输入。

标签: php arrays sorting multidimensional-array array-multisort


【解决方案1】:

这正是PHParray_multisort 派上用场的地方。在这种情况下,您希望根据其中一个数组中发生的比较对多个数组进行排序。

我已修改数组 score 以具有不同的值。

<?php

$arr = array(
                'display_name' => array('ACT_Web_Designs','user1_design','user2_design'),
                'proffesion' => array('Web Developer','web developer','web developer'),
                'score' => array(12,6,15),
                'img' => array('./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic','','')
            );

var_dump($arr);
array_multisort($arr['score'], SORT_ASC, SORT_NUMERIC,
                $arr['display_name'],
                $arr['proffesion'],
                $arr['img']
                );
var_dump($arr);


?>

Here goes a working demo.

【讨论】:

  • 你有没有觉得PHP的排序功能太多了?您需要做的就是找到合适的,然后您的所有问题都会消失。我今天学了一个新的,谢谢。
  • @Christian:同意,有很多排序功能。每一个都是为了解决一个特定的问题。大多数时候我们不必编写自己的排序函数,这很好。
【解决方案2】:

这个更简单的怎么样

$arr = array("k"=>array("A","B","C"),"l"=>array(15,6,15),"n"=>array("k","l","n"));
array_multisort($arr["k"],SORT_NUMERIC,SORT_DESC,$arr["l"],$arr["n"]);
var_dump($arr);

【讨论】:

    【解决方案3】:

    rsort 分数数组不起作用吗?

    rsort($data['score'], SORT_NUMERIC);
    

    【讨论】:

      【解决方案4】:

      我已经做到了,我只是在寻求一种更有效的方法;

      $array = array(
                  'display_name' => array(0 => 'ACT_Web_Designs', 1 => 'user1_design', 2 => 'user2_design' ),
                  'proffesion' => array( 0 => 'Web Developer', 1 => 'web developer', 2 => 'Web Developer' ),
                  'score' => array( 0 => 15, 1 => 6, 2 => 15 ),
                  'img' => array( 0 => './?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic', 1 => '', 2 => '' )
      );
      
      arsort($array['score'], SORT_NUMERIC );
      foreach($array['score'] as $key => $val ) {
          $newarray['display_name'][] = $array['display_name'][$key];
          $newarray['proffesion'][] = $array['proffesion'][$key];
          $newarray['score'][] = $array['score'][$key];
          $newarray['img'][] = $array['img'][$key];
      }
      
      print_r($newarray);
      

      返回

      Array
      (
          [display_name] => Array
              (
                  [0] => ACT_Web_Designs
                  [1] => user2_design
                  [2] => user1_design
              )
      
          [proffesion] => Array
              (
                  [0] => Web Developer
                  [1] => Web Developer
                  [2] => web developer
              )
      
          [score] => Array
              (
                  [0] => 15
                  [1] => 15
                  [2] => 6
              )
      
          [img] => Array
              (
                  [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic
                  [1] => 
                  [2] => 
              )
      
      )
      

      【讨论】:

        【解决方案5】:

        使用 rsort()

        <?php
        $fruits = array("lemon", "orange", "banana", "apple");
        rsort($fruits);
        reset($fruits);
        while (list($key, $val) = each($fruits)) {
            echo "$key = $val\n";
        }
        ?>  
        

        这个例子会显示:

        0 = orange
        1 = lemon
        2 = banana
        3 = apple
        

        【讨论】:

          【解决方案6】:

          我能找到的最优雅的解决方案不会重新排序数据结构,而只是以不同的方式访问它。

          $scores = $data['score'];
          arsort($scores);
          $keys_ordered_by_score = array_keys($scores);
          

          现在,您可以通过以下方式获取最高分的 display_name 和“proffesion”:

          $first_place = $keys_ordered_by_score[0];
          echo $data['display_name'][$first_place],
               ' is a ', $data['proffesion'][$first_place];
          

          当然,如果你真的需要重新排序数据结构,这个想法对你来说毫无用处。使用 array_multisort() 的任何其他答案都可能适合该需求。

          【讨论】:

            【解决方案7】:

            这不会为您重新排序,但它会让您按照您想要的顺序浏览它们。您可以根据需要重新分配它们,但我只是将其用于输出顺序。

            编辑:这将不起作用,因为可能存在非唯一键值。请参阅下面的评论,并从我的错误中吸取教训

            $sort_order = $array['score'];
            arsort($sort_order);
            $sort_order = array_flip($sort_order);
            foreach($sort_order as $key){
                echo $array['display_name'][$key].' - '.$array['score'][$key];
            }

            【讨论】:

            • 我们有同样的想法!但是,您在使用 array_flip 时遇到了问题,因为不能保证分数是唯一的。请参阅我的答案以了解我的变化。
            • 啊,我明白了。谢谢你让我理顺;)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-02
            • 1970-01-01
            • 2015-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多