Gus*_*avo 0 php sorting multidimensional-array
我正在尝试使用多维数组执行与mySQL查询"SELECT*FROM table ORDER BY field1,field2,..."相同的操作:
$Test = array(
array("a"=>"004", "n"=>"03"),
array("a"=>"003", "n"=>"02"),
array("a"=>"001", "n"=>"02"),
array("a"=>"005", "n"=>"01"),
array("a"=>"001", "n"=>"01"),
array("a"=>"004", "n"=>"02"),
array("a"=>"003", "n"=>"01"),
array("a"=>"004", "n"=>"01")
);
function msort(&$array, $keys){
array_reverse($keys);
foreach($keys as $key){
uasort($array, sortByKey);
}
//
function sortByKey($A, $B){
global $key;
$a = $A[$key];
$b = $B[$key];
if($a==$b) return 0;
return ($a < $b)? -1 : 1 ;
}
}
//
msort($Test, array("a","n"));
//
foreach($Test as $t){
echo('<p>'.$t["a"].'-'.$t["n"].'</p>');
}
Run Code Online (Sandbox Code Playgroud)
我的理论是:如果我将多次乘法排序为最重要的密钥,那么我会按照mySQL查询的顺序排序.
但是php正在返回"警告:uasort()期望参数2是有效的回调函数,函数'sortByKey'未找到或者在第23行的/Library/WebServer/Documents/www/teste.array_sort.php中找到无效的函数名"(uasort)线)
这是一个简单的订单功能,我错过了什么?
从根本上说,我们将使用与此处所述相同的方法,我们将使用可变数量的键来执行此操作:
/**
* Returns a comparison function to sort by $cmp
* over multiple keys. First argument is the comparison
* function, all following arguments are the keys to
* sort by.
*/
function createMultiKeyCmpFunc($cmp, $key /* , keys... */) {
$keys = func_get_args();
array_shift($keys);
return function (array $a, array $b) use ($cmp, $keys) {
return array_reduce($keys, function ($result, $key) use ($cmp, $a, $b) {
return $result ?: call_user_func($cmp, $a[$key], $b[$key]);
});
};
}
usort($array, createMultiKeyCmpFunc('strcmp', 'foo', 'bar', 'baz'));
// or
usort($array, createMultiKeyCmpFunc(function ($a, $b) { return $a - $b; }, 'foo', 'bar', 'baz'));
Run Code Online (Sandbox Code Playgroud)
这大约等同于SQL ORDER BY foo, bar, baz
.
当然,如果每个键需要不同类型的比较逻辑,并且您不能使用通用键strcmp
或-
所有键,那么您将返回到此处所述的相同代码.
这是我编写的一些代码来执行类似的操作:
uasort($array,function($a,$b) {
return strcmp($a['launch'],$b['launch'])
?: strcmp($a['tld'],$b['tld'])
?: strcmp($a['sld'],$b['sld']);
});
Run Code Online (Sandbox Code Playgroud)
它有点滥用负数为真(只有零为假)的事实,首先比较launch
,然后tld
,然后sld
。您应该能够轻松地根据您的需求进行调整。