如何对多维关联数组进行排序?

5

好的,我有一个用于传输名称的数组,它看起来像这样:

array(2) {
  [0]=>
  array(3) {
    ["firstName"]=>
    string(3) "Joe"
    ["lastName"]=>
    string(5) "Black"
    ["uid"]=>
    int(3225)
  }
  [1]=>
  array(3) {
    ["firstName"]=>
    string(4) "John"
    ["lastName"]=>
    string(3) "Doe"
    ["uid"]=>
    int(3516)
  }
}

现在,我该如何按 lastName 对该数组进行排序呢?

9
虽然相关问题可能不完全符合您的情况,但其中大部分都包含了完成任务所需的功能和解释。 - Mike B
2
可能是多维数组排序的重复问题。 - Naftali
2
在 https://dev59.com/xVDTa4cB1Zd3GeqPGR3M 上已经几乎完全回答了(需要更改键)。 - jprofitt
3个回答

17

StackOverflow上有很多类似的问题,但让我给你一个快速的例子。为此,您可以使用usort()函数。

PHP 5.3示例(不是最好的示例,但可能更容易理解):

uasort($array, function ($i, $j) {
    $a = $i['lastName'];
    $b = $j['lastName'];
    if ($a == $b) return 0;
    elseif ($a > $b) return 1;
    else return -1;
});

所有的“if..else”都是必要的吗?我认为这可以重构为简单的return $i['lastName'] > $j['lastName']; - galdikas
@galdikas 这份文档表示该函数应返回1、0或-1。不过我已经很长时间没碰PHP了。 - kapa

2

如我在php.net中发布的,您可以使用此函数:

<?php

function sksort(&$array, $subkey="id", $sort_ascending=false) {

    if (count($array))
        $temp_array[key($array)] = array_shift($array);

    foreach($array as $key => $val){
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),
                                            array($key => $val),
                                            array_slice($temp_array,$offset)
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
    }

    if ($sort_ascending) $array = array_reverse($temp_array);

    else $array = $temp_array;
}

?>

2

简短易懂、可重用的方法:

usort($array, 'nameSort');

function nameSort($a, $b)
{
    return strcmp($a['lastName'], $b['lastName']);
}

1
请注意,如果您正在类中执行此操作,则应将数组传递给usort,而不是字符串,如下所示:usort($array, array($this, 'nameSort')); - Justin

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