【问题标题】:Sort an array by a child array's value in PHP在 PHP 中按子数组的值对数组进行排序
【发布时间】:2011-02-10 00:03:18
【问题描述】:

我有一个由数组组成的数组。我想通过子数组的属性对父数组进行排序。这是一个例子

array(2){
    [0]=> array(3){
        [0]=> string(6) "105945"
        [1]=> string(10) "First name"
        [2]=> float(0.080878465391)
    }
    [1]=> array(3) {
        [0]=> string(6) "109145"
        [1]=> string(11) "Second name"
        [2]=> float(0.0504154818384)
    }
}

我想通过 [2] 在子数组中升序对父数组进行排序,因此在这种情况下,结果将是子数组反转(.0508)。这是否可以使用众多 PHP 排序函数中的任何一个?

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    您可以将usort 函数用作:

    $arr = array(
                    array("105945","First name",0.080878465391),
                    array("109145","Second name",0.0504154818384)
                );
    
    function cmp($a, $b) {
            if ($a[2] == $b[2]) {
                    return 0;
            }
            return ($a[2] < $b[2]) ? -1 : 1;
    }
    
    usort($arr,"cmp");
    

    【讨论】:

    • 该页面上的示例 #2 与您要执行的操作非常相似,请看一下。
    • 哇,非常有帮助的答案。谢谢。
    【解决方案2】:

    从 PHP >= 7.0 开始,您可以将 usort 与 spaceship 运算符结合使用

    usort($arr, function ($a, $b) {
            return $a[2] <=> $b[2];
        });
    

    见:http://php.net/manual/de/migration70.new-features.php

    【讨论】:

      【解决方案3】:

      对于类似数据库的模式,请使用 array_multisort,如示例 #3 所示。

      例如:

      $sort = array();
      foreach ($data as $key => $row) {
        $sort[$key]  = $row['basis'];
      }
      array_multisort($sort, SORT_ASC, $data);
      

      其中$data 是您的数据数组,basis 是用于排序的元素。

      【讨论】:

      • 太棒了!感谢分享。
      【解决方案4】:

      例如查看此页面

      http://php.net/manual/en/function.sort.php
      

      或示例

            <?php 
      function multisort($array, $sort_by) {
          foreach ($array as $key => $value) {
              $evalstring = '';
              foreach ($sort_by as $sort_field) {
                  $tmp[$sort_field][$key] = $value[$sort_field];
                  $evalstring .= '$tmp[\'' . $sort_field . '\'], ';
              }
          }
          $evalstring .= '$array';
          $evalstring = 'array_multisort(' . $evalstring . ');';
          eval($evalstring);
      
          return $array;
      } 
      
      $test = array(
          array( 'a' => '1', 'b' => '3'),
          array( 'a' => '2', 'b' => '1'),
          array( 'a' => '1', 'b' => '1'));
      
      echo 'Unsorted: ';
      print_r($test);
      
      $result = multisort( $test , array('a','b') );
      
      echo 'Sorted: ';
      print_r($result);
      ?>
      
      Result:
      
      Unsorted: Array
      (
          [0] => Array
              (
                  [a] => 1
                  [b] => 3
              )
      
          [1] => Array
              (
                  [a] => 2
                  [b] => 1
              )
      
          [2] => Array
              (
                  [a] => 1
                  [b] => 1
              )
      
      )
      Sorted: Array
      (
          [0] => Array
              (
                  [a] => 1
                  [b] => 1
              )
      
          [1] => Array
              (
                  [a] => 1
                  [b] => 3
              )
      
          [2] => Array
              (
                  [a] => 2
                  [b] => 1
              )
      
      )
      

      【讨论】:

      • 这是一些非常可怕的代码——我强烈建议你不要使用它。按照建议使用usort()
      • hey usort() 函数已经提供。所以只有我提供了替代解决方案,我提供了手册中的示例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      相关资源
      最近更新 更多