我需要帮助用PHP对关联数组进行排序。
排序应该依赖于数组键“name”,并保持键/值对。按照排序顺序: 1)第一个整数 ASC,2)第二个整数 ASC,3)第三个混合 ASC
输入
array(6) {
[0]=>
array(2) {
["name"]=>
string(13) "60 to 90 in 6"
["timing"]=>
float(4.7)
}
[1]=>
array(2) {
["name"]=>
string(15) "40 to 120 in KD"
["timing"]=>
float(3.3)
}
[2]=>
array(2) {
["name"]=>
string(14) "60 to 100 in 4"
["timing"]=>
float(1.5)
}
[3]=>
array(2) {
["name"]=>
string(13) "60 to 90 in 4"
["timing"]=>
float(2.4)
}
[4]=>
array(2) {
["name"]=>
string(15) "140 to 160 in 6"
["timing"]=>
float(2.4)
}
[5]=>
array(2) {
["name"]=>
string(13) "60 to 90 in KD"
["timing"]=>
float(5.7)
}
}
输出订单
1, 3, 0, 5, 2, 4
非常感谢你的帮助。
uasort($acceleration, function($a, $b) {
if($a['_sort'][0] == $b['_sort'][0] AND $a['_sort'][2] == $b['_sort'][2])
{
if($a['_sort'][4] < $b['_sort'][4])
return -1;
elseif($a['_sort'][4] > $b['_sort'][4])
return 1;
else
return 0;
}
elseif($a['_sort'][0] == $b['_sort'][0])
{
if($a['_sort'][2] < $b['_sort'][2])
return -1;
elseif($a['_sort'][2] > $b['_sort'][2])
return 1;
return 0;
}
else
{
if($a['_sort'][0] < $b['_sort'][0])
return -1;
elseif($a['_sort'][0] > $b['_sort'][0])
return 1;
else
return 0;
}
});
我敢肯定,有一种更优雅的方式,但可以作为输入。
答案 0 :(得分:0)
在使用uasort()排序后,您需要此数组的array_keys。比较函数(闭包)应该很容易编写。
答案 1 :(得分:0)
您应该使用usort(),它允许您使用用户定义的comarison函数进行排序。因此,您必须实现比较neme字段并根据结果返回-1,0或1值的函数(少于,等于或大于)。此函数可以使用正则表达式从name strng字段中获取三个值,然后使用您的条件对它们进行比较。
答案 2 :(得分:0)
<?php
$acceleration = array();
$acceleration[0]= array("name" => "60 to 90 in 6", "timing" => 4.7 );
$acceleration[1]= array("name" => "40 to 120 in KD", "timing" => 3.3 );
$acceleration[2]= array("name" => "60 to 100 in 4", "timing" => 1.5 );
$acceleration[3]= array("name" => "60 to 90 in 4", "timing" => 2.4 );
$acceleration[4]= array("name" => "140 to 160 in 6", "timing" => 2.4 );
$acceleration[5]= array("name" => "60 to 90 in KD", "timing" => 5.7 );
function comp_maker( $key ) {
return function ($a, $b) use ( $key ) { // closure for uasort() to use
return strnatcmp( $a[$key], $b[$key] ); // comp by "natural order"
};
}
uasort($acceleration, comp_maker( 'name' ) );
// display sorted array's keys
$str = '';
foreach ( $acceleration as $key => $value ){
$str .= ", $key";
}
echo substr($str,1);
// output: 1, 3, 0, 5, 2, 4
您还可以查看代码here
此解决方案遵循有关应用uasort()的sage建议,这比usort()更合适,因为它保留了数组的键值关联。如果没有这些维护,结果将是:0,1,2,3,4,5隐藏了原始数组的重新排序方式。
请注意,uasort()的第二个参数将作为调用comp_maker()函数的结果计算为闭包。 uasort()反过来会调用闭包,以便它可以执行比较。通过使用strnatcmp()根据“人类顺序”进行排序,因此值按照预期的升序显示。
为了获得结果,我可以使用array_keys(),但是通过使用key,value语法迭代数组来输出排序数组键的新顺序,而选择避免函数调用的开销。