我尝试以这种方式对多维数组进行排序,以便不应对具有相同值的元素进行重新排序。
这是给定的数组,应按 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
,所以我甚至不必更改我的数组。
感谢所有为这篇文章做出贡献的人!