我尝试按顺序对多维数组进行排序,以便不应重新排序具有相同值的元素。
这是给定的数组,应该按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
)
)
答案 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']);
}