对多维数组进行排序时出现问题


Problems with 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
        )
)
我想

改进你自己的答案以排除低效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']);
}

尝试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
        )
)

浏览完帖子后(如何在 PHP 中对数组和数据进行排序?[如何在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,所以我甚至不必更改我的数组。

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