按照特定键对多维数组进行排序

37

我有一个数组:

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) {
    ...
}

我该怎么做?

7个回答

47

你可以使用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 是正确的函数吗?我猜根据类型分别使用比较器函数可能是个好主意... - jsh

17

参见usort: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;
}

10

我已经在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);

如果要按升序/降序排序,只需添加一个参数。

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

1
create_function在php 7.2.0中已被弃用。 - Shakeel Ahmed

4

一个更简单的方法是...

$key = array_column($blogusers, 'display_name');
array_multisort($key, SORT_ASC, $blogusers]

foreach ($blogusers as $bloguser) ...

1
https://dev59.com/TW855IYBdhLWcg3wik-D#72835614 - mickmackusa
这是正确且最佳的方法,因为array_multisort()还允许你按多个索引进行排序。 - Lorenzo Magon

0

你的数组看起来像是数据库查询的结果。如果是这种情况,让数据库来进行排序:只需在查询末尾添加 ORDER BY display_name


-1
如果你遇到了错误或者你的数组没有排序,你可以尝试这个方法,因为它对我很有效。
usort($blogusers,function ($a, $b)
{
    return strcmp($a["display_name"], $b["display_name"]);
});

那不是访问对象属性的正确方式。 - mickmackusa

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接