使用两个值对PHP数组进行排序

时间:2013-08-09 22:30:38

标签: php arrays sorting alphabetical-sort

例如,假设我有一个这种格式的PHP数组:

[
{"optionname":"Math","optionid":"35741"},
{"optionname":"Robotics","optionid":"80229"},
{"optionname":"fndbwoiaghoe","optionid":"1105065296"},
{"optionname":"iphewajgiewohfoidsahg","optionid":"1385274203"},
{"optionname":"wpeogagpoar","optionid":"1030886790"},   
{"optionname":"genpwaighipwe","optionid":"1193090269"}
]

如何按字母顺序按“optionname”的值对数组进行排序?

谢谢!

1 个答案:

答案 0 :(得分:1)

由于您的代码示例,我假设您有一个JSON编码的数组。

您希望不对值进行排序,而是对值的特定属性进行排序。 PHP无法知道您要考虑哪个特定属性。你必须给PHP一个方法,用你自己的函数知道哪个对象在另一个对象面前。然后,您可以使用usort()告诉PHP使用该函数进行排序比较。

$arr = json_decode('
[
    {"optionname":"Math","optionid":"35741"},
    {"optionname":"Robotics","optionid":"80229"},
    {"optionname":"fndbwoiaghoe","optionid":"1105065296"},
    {"optionname":"iphewajgiewohfoidsahg","optionid":"1385274203"},
    {"optionname":"wpeogagpoar","optionid":"1030886790"},   
    {"optionname":"genpwaighipwe","optionid":"1193090269"}
]
');

usort($arr, function ($obj1, $obj2) {
    return strcasecmp($obj1->optionname, $obj2->optionname);
});

$arr = json_encode($arr);

请注意,上面的代码比较了optionname属性不区分大小写。如果您希望PHP考虑案例,请将strcasecmp替换为strcmp

编辑:如果您使用的是早于5.3的PHP版本,则尚不支持匿名函数(如上面用作usort()函数的第二个参数的函数)。下面的版本应该适用。

$arr = json_decode('
[
    {"optionname":"Math","optionid":"35741"},
    {"optionname":"Robotics","optionid":"80229"},
    {"optionname":"fndbwoiaghoe","optionid":"1105065296"},
    {"optionname":"iphewajgiewohfoidsahg","optionid":"1385274203"},
    {"optionname":"wpeogagpoar","optionid":"1030886790"},   
    {"optionname":"genpwaighipwe","optionid":"1193090269"}
]
');

function compareObjects($obj1, $obj2)
{
    return strcasecmp($obj1->optionname, $obj2->optionname);
}
usort($arr, 'compareObjects');

$arr = json_encode($arr);