【问题标题】:How do I sort a PHP array by an element nested inside? [duplicate]如何按嵌套在其中的元素对 PHP 数组进行排序?
【发布时间】:2011-04-11 17:44:28
【问题描述】:

我有一个如下数组:

大批 ( [0] => 数组 ( '名字' => "星期五" '重量' => 6 ) [1] => 数组 ( '名字' => "星期一" '重量' => 2 ) )

我想获取该数组中的最后一个值(“权重”),并使用它对主要数组元素进行排序。所以,在这个数组中,我想对它进行排序,使 'Monday' 元素出现在 'Friday' 元素之前。

【问题讨论】:

标签: php arrays sorting multidimensional-array usort


【解决方案1】:

您可以将usort 用作:

function cmp($a, $b) {
   return $a['weight'] - $b['weight'];
}

usort($arr,"cmp");

【讨论】:

  • 你可以简单地使用return $a['weight'] - $b['weight'];
  • 这对我来说并不完美,但这似乎是完全正确的解决方案:
【解决方案2】:

【讨论】:

    【解决方案3】:

    同意usort,我有时也用array_multisort(http://ca2.php.net/manual/en/function.usort.php)例子3,对数据库结果进行排序。 你可以这样做:

    <?php
    $days = array(
      array('name' => 'Friday', 'weight' => 6),
      array('name' => 'Monday', 'weight' => 2),
    );
    
    $weight = array();
    foreach($days as $k => $d) {
      $weight[$k] = $d['weight'];
    }
    
    print_r($days);
    
    array_multisort($weight, SORT_ASC, $days);
    
    print_r($days);
    ?>
    

    输出:

    Array
    (
        [0] => Array
            (
                [name] => Friday
                [weight] => 6
            )
    
        [1] => Array
            (
                [name] => Monday
                [weight] => 2
            )
    
    )
    Array
    (
        [0] => Array
            (
                [name] => Monday
                [weight] => 2
            )
    
        [1] => Array
            (
                [name] => Friday
                [weight] => 6
            )
    
    )
    

    【讨论】:

      【解决方案4】:

      这是一个很酷的功能,可能会有所帮助:

      function subval_sort($a,$subkey,$sort) {
          foreach($a as $k=>$v) {
              $b[$k] = strtolower($v[$subkey]);
          }
          if($b)
          {
              $sort($b);
              foreach($b as $key=>$val) {
                  $c[] = $a[$key];
              }
              return $c;
          }
      }
      

      $a 的形式发送数组,将$subkey 的键和$sort 变量的'asort' 或'sort' 一起发送

      【讨论】:

        【解决方案5】:

        可以使用匿名函数来完成。

        此外,如果您的“体重”是 字符串,请使用其他返回值之一(请参阅注释掉的行):

        <?php
        
        $arr = array(
            0 => array (
                'name'   => 'Friday',
                'weight' => 6,
            ),
            1 => array (
                'name'   => 'Monday',
                'weight' => 2,
            ),
        );
        
        // sort by 'weight'
        usort($arr, function($a, $b) { // anonymous function
            // compare numbers only
            return $a['weight'] - $b['weight'];
        
            // compare numbers or strings
            //return strcmp($a['weight'], $b['weight']);
        
            // compare numbers or strings non-case-sensitive
            //return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
        });
        
        var_export($arr);
        
        /*
        array (
            0 => array (
                'name'   => 'Monday',
                'weight' => 2,
            ),
            1 => array (
                'name'   => 'Friday',
                'weight' => 6,
            ),
        )
        */
        

        【讨论】:

          【解决方案6】:

          您也可以使用匿名函数。

          usort($items, function($a, $b) {
              return $a['name'] > $b['name'];
          });
          

          【讨论】:

            【解决方案7】:

            如果您排序的文件是 title name
            array_multisort + Natural Sorting 的标志和 CaseInSensitivity 之类的字符串:

            $sort_by_title = array();
            foreach($items as $item) {
              $sort_by_title [] = $item['title'];
            }
            array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
            

            【讨论】:

              【解决方案8】:

              注意,如果您要排序的元素是 .0534 和 .0353 之类的浮点数(例如百分比),那么您必须将两者都乘以 1000。坦率地说,不知道为什么……看来 usort 似乎比较整数值。

              我花了一些时间才弄明白...

              还有 2 个可能不会立即明显的提示:

              1. 如果你的数组是对象,你可以使用 return $a->weight - $b->weight 当然
              2. 如果返回 $b->weight - $a->weight,它会降序排序。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-07-16
                • 1970-01-01
                • 2015-08-27
                • 1970-01-01
                • 1970-01-01
                • 2015-11-06
                • 1970-01-01
                相关资源
                最近更新 更多