在PHP中,如何按不同数量的字段对多维数组进行排序?

在PHP中,如何按不同数量的字段对多维数组进行排序?,php,arrays,sorting,Php,Arrays,Sorting,可能重复: 这不是重复的。在stackoverflow上确实有很多关于多维数组排序的问题(我相信我昨天在发布我的问题之前阅读了其中的大部分…),但我所看到的没有一个涉及到我的特殊问题:按字段的变量数排序。下面@dev null居住者给出的答案就是这样的 我试图在PHP中为多维数组创建一个灵活的排序函数 我所追求的灵活性是排序字段的数量(对于一级、二级或三级排序,可以是1、2或3),以及这些字段的标识 这是我的阵列的一个示例位: Array ( [0] => Array (

可能重复:

这不是重复的。在stackoverflow上确实有很多关于多维数组排序的问题(我相信我昨天在发布我的问题之前阅读了其中的大部分…),但我所看到的没有一个涉及到我的特殊问题:按字段的变量数排序。下面@dev null居住者给出的答案就是这样的

我试图在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然后按标题,等等

我成功地进行了2级排序,如下所示:

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']);
  }

}
usort($arrCatalog,array('Catalogs\u model','multi\u compare');
多功能比较($a,$b){
如果($a['con']<$b['con']){
返回-1;
}elseif($a['con']>$b['con']){
返回1;
}否则{
返回strcmp($a['title',$b['title');
}
}
第一个问题是,当从
usort
中调用时,如何将参数传递给
multi\u compare
函数


在我们解决了这个问题之后,我很乐意得到一些关于如何更改
多重排序
的建议,以便标识和\或字段的数量有所不同。

您正在使用静态方法进行自定义排序,因此您可以在
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'));

当然,它需要一些调整,因为现在它只对字符串进行排序。

您可以将参数传递给匿名函数:(使用“use”关键字)谢谢!工作就像一个符咒:-)