排序多维数组的问题

时间:2016-02-17 12:17:29

标签: php sorting multidimensional-array

我尝试按顺序对多维数组进行排序,以便不应重新排序具有相同值的元素

这是给定的数组,应该按type

的值排序
$arr = array(

    "a" => array(
        "type" => 1
    ),
    "d" => array(
        "type" => 1
    ),
    "super" => array(
        "type" => 2
    ),
    "c" => array(
        "type" => 1
    ),
    "b" => array(
        "type" => 1
    )

);

排序后的数组应该如下所示:

Array
(
    [super] => Array
        (
            [type] => 2
        )

    [a] => Array
        (
            [type] => 1
        )

    [d] => Array
        (
            [type] => 1
        )

    [c] => Array
        (
            [type] => 1
        )

    [b] => Array
        (
            [type] => 1
        )

)

3 个答案:

答案 0 :(得分:0)

尝试uasort:如果您仍然使用PHP 5.2或更早版本,则必须首先定义排序功能:

$myArray = array(

    "a" => array(
        "type" => 1
    ),
    "d" => array(
        "type" => 1
    ),
    "super" => array(
        "type" => 2
    ),
    "c" => array(
        "type" => 1
    ),
    "b" => array(
        "type" => 1
    )

);
function sortByOrder($a, $b)
{
    return $b['type'] - $a['type'];
}

uasort($myArray, 'sortByOrder');
print_r($myArray);

从PHP 5.3开始,您可以使用匿名函数:

uasort($myArray, function ($a, $b) {
    return $b['type'] - $a['type'];
});

最后,使用PHP 7,您可以使用"太空飞船运营商":

uasort($myArray, function ($a, $b) {
        return $b['type'] <=> $a['type'];
});

<强>输出:

Array
(
    [super] => Array
        (
            [type] => 2
        )

    [b] => Array
        (
            [type] => 1
        )

    [c] => Array
        (
            [type] => 1
        )

    [a] => Array
        (
            [type] => 1
        )

    [d] => Array
        (
            [type] => 1
        )

)

答案 1 :(得分:0)

浏览帖子后(如何在PHP中对数组和数据进行排序?)[How can I sort arrays and data in PHP?,我找到了解决问题的方法。

如果类型相同,我将元素排序为静态顺序,我从第二个值id得到。

要排序的数组:

$array = array(

    "a" => array(
        "id" => "a",
        "type" => 1
    ),
    "c" => array(
        "id" => "c",
        "type" => 1
    ),
    "super" => array(
        "id" => "super",
        "type" => 2
    ),
    "b" => array(
        "id" => "b",
        "type" => 1
    )

);

脚本:

$sort_keys = array_column($array, "id");

function cmp($a, $b){

    global $sort_keys;

    if ($a["type"] < $b["type"]) {
        return 1;
    } else if ($a["type"] > $b["type"]) {
        return -1;
    } else {
        return array_search($a["_id"], $sort_keys) - array_search($b["_id"], $sort_keys);
    }

}

uasort($array, 'cmp');

我的脚本中已经有了id字段,所以我甚至不需要更改我的数组。

感谢所有为这篇文章做出贡献的人!

答案 2 :(得分:0)

我想改进您自己的答案,以排除效率低下的array_search()。最好在排序之前对数组项进行索引,并将其用于相同的类型。

$index = 0;
foreach ($arr as $key => $value) {
  $arr[$key]['index'] = $index;
  $index++;
}

uasort($arr, function($a, $b) {
  if ($a['type'] < $b['type']) {
    return 1;
  } elseif ($a['type'] > $b['type']) {
    return -1;
  } else {
    return $a['index'] - $b['index'];
  }
});

foreach ($arr as $key => $value) {
  unset($arr[$key]['index']);
}