........
这不重复。关于排序多维数组的stackoverflow确实有很多问题(我相信我昨天在发布我的问题之前已经阅读了大部分内容...),但我所看到的没有提到我的特定问题:按字段数量 。下面@ dev-null-dweller给出的答案就是这样。
........
我正在尝试为PHP中的多维数组创建一个灵活的排序函数。
我所追求的灵活性是排序字段的数量(对于第一级,第二级或第三级排序可以是1,2或3),以及这些字段的标识。
这是我的数组的一个示例位:
Array
(
[0] => Array
(
[title] => Australia Book
[price] => 209.00
[code] => 3571313
[con] => Australia & Oceania
[ctry] => Australia
)
[1] => Array
(
[title] => New Zealand Book
[price] => 169.00
[code] => 3571346
[con] => Australia & Oceania
[ctry] => New Zealand
)
[2] => Array
(
[title] => Austria Book
[price] => 129.00
[code] => 3571230
[con] => Europe
[ctry] => Austria
)
[3] => Array
(
[title] => Austria Pocket Book
[price] => 119.00
[code] => 3571354
[con] => Europe
[ctry] => Austria
)
[4] => Array
(
[title] => Amsterdam Book
[price] => 59.00
[code] => 3571350
[con] => Europe
[ctry] => Netherlands
)
[5] => Array
(
[title] => Britain
[price] => 59.00
[code] => 3571315
[con] => Europe
[ctry] => Britain
)
)
我有时候只需按标题排序,有时候需要通过ctry然后标题,有时通过con,然后是ctry然后标题等等。
我设法做了两级排序:
usort($arrCatalog, array('Catalogs_model', 'multi_compare'));
function multi_compare($a ,$b) {
if ($a['con'] < $b['con']) {
return -1;
} elseif ($a['con'] > $b['con']) {
return 1;
} else {
return strcmp($a['title'], $b['title']);
}
}
第一个问题是,当从multi_compare
内调用时,如何将参数传递给usort
函数。
在我们解决之后,我会很高兴看到如何更改multi_sort
的一些指示,以便字段和/或字段数量会有所不同。
答案 0 :(得分:1)
您正在使用静态方法进行自定义排序,因此您可以在usort
class Catalogs_model{
public static $usort_criteria = array();
public static function multi_compare($a,$b){
foreach(self::$usort_criteria as $what => $order){
if($a[$what] == $b[$what]){
continue;
}
return (($order == 'desc')?-1:1) * strcmp($a[$what], $b[$what]);
}
return 0;
}
}
Catalogs_model::$usort_criteria = array(
'con' => 'asc',
'title' => 'asc'
);
usort($arrCatalog, array('Catalogs_model', 'multi_compare'));
当然需要一些调整,因为现在它只对字符串进行排序。