【问题标题】:sort a multi-dimensional associative array?对多维关联数组进行排序?
【发布时间】:2011-12-20 11:51:40
【问题描述】:

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

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 对这个数组进行排序?

【问题讨论】:

标签: php arrays sorting multidimensional-array


【解决方案1】:

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 文档说该函数应返回 1、0 或 -1。不过我已经很久没有接触 PHP了。
【解决方案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;
}

?>

【讨论】:

    【解决方案3】:

    短且可重复使用的方法:

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

    【讨论】:

    • 另请注意,如果您在课堂上执行此操作,您需要将数组而不是字符串传递给 usort,如下所示:usort($array, array($this, 'nameSort'));
    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 2017-12-01
    • 2013-04-09
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2010-10-13
    相关资源
    最近更新 更多