【问题标题】:Sort multi-dimensional array by specific key按特定键对多维数组进行排序
【发布时间】:2010-10-26 09:24:29
【问题描述】:

我有一个数组:

Array (
    [0] => stdClass Object (
        [user_id] => 1
        [ID] => 1
        [user_login] => admin
        [display_name] => admin
        [user_email] => webbinformation@nacka.se
        [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";}
    )
    [1] => stdClass Object (
        [user_id] => 4
        [ID] => 4
        [user_login] => ungtinflytande
        [display_name] => ungtinflytande
        [user_email] => klarakviberg@gmail.com
        [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";}
    )
    [2] => stdClass Object (
        [user_id] => 5
        [ID] => 5
        [user_login] => inflytandepilot
        [display_name] => inflytandepilot
        [user_email] => hildalundgren@hotmail.com
        [meta_value] => a:1:{s:6:\"author\";s:1:\"1\";}
    )
    [3] => stdClass Object (
        [user_id] => 11
        [ID] => 11
        [user_login] => matsbohman
        [display_name] => matsbohman
        [user_email] => mats.bohman@nacka.se
        [meta_value] => a:1:{s:6:\"editor\";s:1:\"1\";}
    )
    [4] => stdClass Object (
        [user_id] => 12
        [ID] => 12
        [user_login] => klarakviberg
        [display_name] => klarakviberg
        [user_email] => nastasteg@nacka.se
        [meta_value] => a:1:{s:13:\"administrator\";s:1:\"1\";}
    )
)

...我想按display_name 键排序。我目前是这样打印的:

foreach ($blogusers as $bloguser) {
    ...
}

我该怎么做?

【问题讨论】:

    标签: php sorting ksort


    【解决方案1】:

    你会使用 usort() - http://php.net/usort

    我的建议是:

        function cmp($a, $b)
        {
            return strcmp($a->display_name, $b->display_name);
        }
    
        usort($blogusers, "cmp");
    
        foreach ($blogusers as $bloguser)
        {
            ...
    

    【讨论】:

    • usort() 肯定是要走的路。如果要对浮点数进行排序,strcmp 是正确的函数吗?我的猜测是根据类型单独的比较器函数可能是个好主意...
    【解决方案2】:

    查看排序:http://php.net/manual/en/function.usort.php

    usort($array, "my_cmp");
    
    function my_cmp($a, $b) {
      if ($a->display_name == $b->display_name) {
        return 0;
      }
      return ($a->display_name < $b->display_name) ? -1 : 1;
    }
    

    【讨论】:

      【解决方案3】:

      我在https://joshtronic.com/2013/09/23/sorting-associative-array-specific-key/找到答案

      function sortBy($field, &$array, $direction = 'asc')
      {
          usort($array, create_function('$a, $b', '
              $a = $a["' . $field . '"];
              $b = $b["' . $field . '"];
      
              if ($a == $b)
              {
                  return 0;
              }
      
              return ($a ' . ($direction == 'desc' ? '>' : '<') .' $b) ? -1 : 1;
          '));
      
          return true;
      }
      

      现在通过特定的数组键调用这个函数。

      $newArray = sortBy('display_name',   $blogusers);
      

      如果在 asc/desc 中排序只需添加一个参数,

      sortBy('display_name',   $blogusers, 'desc');
      

      【讨论】:

      • create_function 在 php 7.2.0 中已弃用
      【解决方案4】:

      您的数组看起来像数据库查询的结果。如果是这种情况,让数据库进行排序:只需将 ORDER BY display_name 附加到查询中。

      【讨论】:

        【解决方案5】:

        看看下面的文章。它确实描述了如何使用usort(),还描述了如何使用create_function(),以便您可以使用单个函数对不同的字段进行排序(需要方向ascdesc)。

        http://phpave.com/sorting-associative-array-specific-key/

        【讨论】:

          【解决方案6】:

          如果您遇到错误或您的数组没有排序,您可以尝试一下,因为这对我有用-

          usort($blogusers,function ($a, $b)
          {
              return strcmp($a["display_name"], $b["display_name"]);
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多