我有一个函数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
,但这看起来很草率,而且不是很容易预测,所以我们将非常感谢更好的行动方案。
答案 0 :(得分:2)
他们被覆盖的原因是因为您正在创建一个数组,其中索引是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];
});
}
答案 1 :(得分:2)
您可以简化代码,只需使用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);