我有一个函数sortBy()
,我使用它按特定键对多维数组排序。下面是一个示例数组:
Array
(
[0] => Array
(
[id] => 4
[type] => 1
[game] => 1
[platform] => 0
[TotalPot] => 7550
)
[1] => Array
(
[id] => 5
[type] => 0
[game] => 2
[platform] => 0
[TotalPot] => 7500
)
)
函数
function sortBy($arr, $field='id', $order=1) {
$a = array();
if ( !is_array($arr) )
return false;
foreach($arr as $subArr) {
$a[$subArr[$field]] = $subArr;
}
if ( $order == 1 ) sort($a);
else rsort($a);
return $a;
}
在这种情况下,调用sortBy($array, 'TotalPot');
可以正常工作,因为TotalPot
的两个值是不同的。但是,如果您运行这个示例并将两个TotalPot
字段设置为$7500,它将用后者覆盖第一个字段。
让这个函数允许两个值相同的项,但仍然保持它们的相关顺序,最好的方法是什么?我想过在末尾添加另一个字符,A
或1
,但这似乎很草率,也不是很可预测,所以一个更好的行动方案将是非常感激的。
您可以简化代码,只使用usort()
,例如
function sortArrayByField(array &$arr, $field = "id", $ASC = TRUE) {
usort($arr, function($a, $b)use($field, $ASC){
if($a[$field] == $b[$field])
return 0;
return $a[$field] > $b[$field] ? $ASC : !$ASC;
});
}
然后像这样调用它:
sortArrayByField($array, "TotalPot", TRUE);
print_r($array);
它们被覆盖的原因是您正在创建一个数组,其中索引是totalPot的值。
如果有重复项,那么你只有一个包含totalPot的数组元素。
最简单的方法就是使用这个:
<?php
$array = [
[
"id" => 4,
"type" => 1,
"game" => 1,
"platform" => 0,
"TotalPot" => 7550
], [
"id" => 5,
"type" => 0,
"game" => 2,
"platform" => 0,
"TotalPot" => 7500
]
];
usort($array, function($a, $b) {
return $a['TotalPot'] - $b['TotalPot'];
});
print_r($array);
输出:Array
(
[0] => Array
(
[id] => 5
[type] => 0
[game] => 2
[platform] => 0
[TotalPot] => 7500
)
[1] => Array
(
[id] => 4
[type] => 1
[game] => 1
[platform] => 0
[TotalPot] => 7550
)
)
你也可以使它成为一个函数:
function sortBy($arr, $field='id', $order=1) {
usort($arr, function($a, $b) use ($field, $order) {
if ($order == 1)
return $a[$field] - $b[$field];
else
return $b[$field] - $a[$field];
});
}