如何在PHP中按数组第3个字段从大到小排序(无命名键)
解决PHP二维无键数组按指定字段降序排序的问题
没问题,要实现这个二维无键数组按每个子项的第三个字段(索引为2的元素)从大到小排序,用PHP的内置函数就能轻松搞定,我给你两种实用的实现方案:
方案一:使用usort()自定义排序逻辑
usort()可以让我们自定义数组的排序规则,PHP7及以上版本用太空船运算符(<=>)能简洁又安全地处理数值比较:
// 你的原二维数组 $countries = [ ['Argentina', 'AR', 20.1], ['Austria', 'AT', 20.1], ['Australia', 'AU', 20.1], ['Azerbaijan', 'AZ', 20.1], ['Bosnia and Herzegovina', 'BA', 20.1], ['Barbados', 'BB', 20.1], // 其他省略的元素... ]; // PHP 7.4+ 箭头函数写法(更简洁) usort($countries, fn($a, $b) => $b[2] <=> $a[2]); // 或者兼容PHP7.0-7.3的匿名函数写法 // usort($countries, function($a, $b) { // return $b[2] <=> $a[2]; // }); // 输出排序后的数组 print_r($countries);
如果你的PHP版本低于7.0,可以用传统的条件比较写法:
usort($countries, function($a, $b) { if ($a[2] === $b[2]) { return 0; } // 降序排序,所以当$a[2]小于$b[2]时返回1,反之返回-1 return $a[2] < $b[2] ? 1 : -1; });
方案二:使用array_multisort()按列排序
如果你觉得自定义回调有点麻烦,array_multisort()是更直观的按列排序方案——先提取所有子数组的第三个字段值,再以此为依据对原数组排序:
// 提取所有子数组的第三个元素(索引2)作为排序基准 $sortKeys = array_column($countries, 2); // 按$sortKeys降序,同步对原数组$countries排序 array_multisort($sortKeys, SORT_DESC, $countries); // 输出结果 print_r($countries);
补充说明
- 两种方案都能实现降序排序,如果要改成升序,只需要把
$b[2] <=> $a[2]换成$a[2] <=> $b[2],或者把SORT_DESC改成SORT_ASC即可。 - 对于值相同的元素(比如示例里的20.1),
usort()属于不稳定排序,原数组的相对顺序可能会改变;如果需要保留原顺序,array_multisort()在值相同时会默认保留原数组的元素顺序。
内容的提问来源于stack exchange,提问作者Mike Dray
相关产品推荐
相关产品推荐

