我已经厌倦了找到排序这个多维数组的方法。
我试过usort()
,但它没有按照我想要的方式排序。或者只是也许我无法弄清楚要使用的正确逻辑。 usort()
对我来说似乎很难理解。
我想对我的数据进行排序(下面的示例),首先查找每个子数组的值越高(键a和b 之间的)。然后,从其键a或b中具有最高值的子数组将位于顶部。
例如这个数组:
Array
(
[0] => Array
(
[a]=>5
[b]=>
[c]=>apple
)
[1] => Array
(
[a]=>5
[b]=>7
[c]=>guava
)
[2] => Array
(
[a]=>6
[b]=>
[c]=>banana
)
[3] => Array
(
[a]=>5
[b]=>
[c]=>avocado
)
)
应按如下方式排序:
Array
(
[0] => Array
(
[a]=>5
[b]=>7
[c]=>guava
)
[1] => Array
(
[a]=>6
[b]=>
[c]=>banana
)
[2] => Array
(
[a]=>5
[b]=>
[c]=>apple
)
[3] => Array
(
[a]=>5
[b]=>
[c]=>avocado
)
那么我究竟能做到这一点?我很困惑如何使用usort。用于排序的最佳PHP函数是什么?
答案 0 :(得分:3)
usort()
的工作方式是,它需要一种方法来比较数组的元素,以决定最先出现的是什么。您为它提供了一个函数,它为输入数组中的每个元素对调用该函数。如果函数返回负值,则意味着第一个参数小于第二个参数,并且应该在排序数组中位于它之前。如果它返回正值,则相反。
假设您正在比较两个子阵列s1
和s2
。使用您提供的逻辑,s1
“小于”s2
- 也就是说,s1
应该在s2
之前 - 如果max(s1.a,s1.b) > max(s2.a,s2.b)
。因此,如果为真,则sort函数应返回负值。如果从s1
的最大值中减去s2
的最大值,则应该得到正确的结果。
试试这个:
function sort_function(array $arr1, array $arr2) {
$arr1_val = max($arr1['a'],$arr1['b']);
$arr2_val = max($arr2['a'],$arr2['b']);
return $arr2_val - $arr1_val;
}
usort($arr,sort_function);
假设$arr
是你的数组。
答案 1 :(得分:2)
您的比较功能:
function cmp($a,$b){
// clean up the keys so they don't cause weird cross-type comparisons
(empty($a['a']) ? $a['a'] = 0 : NULL;
(empty($a['b']) ? $a['b'] = 0 : NULL;
(empty($b['a']) ? $b['a'] = 0 : NULL;
(empty($b['b']) ? $b['b'] = 0 : NULL;
/// figure out the pertinent value to compare
$value_from_a_to_compare = max($a['a'],$a['b']);
$value_from_b_to_compare = max($b['a'],$b['b']);
if($value_from_a_to_compare == $value_from_b_to_compare) {
return 0;
}
if($value_from_a_to_compare > $value_from_b_to_compare) {
return 1;
} else {
return -1;
}
}
从usort中调用
usort($your_array,'cmp');
var_dump($your_array);
答案 2 :(得分:2)
有几种方法,包括编写dethtron5000编写的函数,可以让你使用usort。
我将描述一个不同的建议:创建一个辅助数组,在其中放置第一个数组中的最高数字,然后使用array_multisort
使用辅助数组中的值对它们进行排序。
$helper = array();
foreach ($data as $value)
{
$helper[] = max($value['a'],$value['b']);
}
array_multisort($helper,$data);