PHP多维数组按指定数字字段key=2排序的实现问题咨询
PHP多维数组排序问题解决方案
原有代码错误说明
- 第一种
array_multisort实现错误:array_column的第二个参数错误传入了$myarray[2](外层数组索引为2的元素),你需要提取的是每个子数组索引为2的值,应直接传数字2作为参数,且未明确排序逻辑对象导致排序不符合预期。 - 第二种
usort实现错误:回调函数参数写法错误,array($myarray[2], 'sort_function')是调用对象方法的写法,你定义的是全局函数,且排序逻辑直接比较整个子数组,没有提取两个元素索引为2的值进行比较,完全不符合需求。
正确实现方案
场景1:外层数组按子数组索引为2的值升序排序(匹配你补充的第二个示例需求)
需求说明:外层数组的多个元素按照每个元素内部索引为2的数值大小排序,比如你给出的三个2020子数组,按索引2的值157、257、357的顺序排列。
方案1:使用array_multisort
// 提取所有子数组索引为2的值作为排序基准列 $sortBase = array_column($myarray, 2); // 按基准列升序排序,同步修改原数组 array_multisort($sortBase, SORT_ASC, $myarray);
方案2:使用usort/uasort
如果需要保留外层数组的键名(比如年份键),使用uasort,否则使用usort即可:
// 不保留外层键名用usort usort($myarray, function($a, $b) { return $a[2] <=> $b[2]; }); // 保留外层键名用uasort uasort($myarray, function($a, $b) { return $a[2] <=> $b[2]; });
场景2:每个子数组内部按值升序排序(匹配你第一个期望输出结果)
需求说明:每个年份对应的子数组自己按值从小到大排序,比如原2020子数组[123,234,45]排序后变成[45,123,234]。
// 遍历所有子数组,引用传递直接修改原数组 foreach ($myarray as &$subArray) { // 按值升序排序,需要保留子数组键名的话把sort换成asort sort($subArray); } // 销毁引用变量,避免后续操作污染数组 unset($subArray);
内容的提问来源于stack exchange,提问作者user3052443
相关产品推荐
相关产品推荐

