PHP实现JSON解码后关联多维数组按age键升/降序排序
PHP按指定键对多维数组排序实现方案
首先明确解码前提:调用json_decode解析JSON时需要传入第二个参数true,才能得到关联数组格式的解析结果,示例解码代码如下:
$json = '[ { "number": 1, "name": "masoud ahmadi", "age": 16, "school": "Amir kabir" }, { "number": 2, "name": "mohammad hosseini", "age": 14, "school": "Andishe" }, { "number": 3, "name": "Mohammad hosseini", "age": 14, "school": "Allame" }, { "number": 4, "name": "ali akabr", "age": 16, "school": "Allame" } ]'; // 解码得到关联多维数组 $users = json_decode($json, true);
方法1:array_multisort 简洁实现(推荐)
先通过array_column提取所有age键的值组成排序依据数组,再和原数组一起传入排序函数,可快速切换升/降序规则:
// 提取所有age字段的值作为排序依据 $ages = array_column($users, 'age'); // 按age升序排序(年龄从小到大),排序后直接修改原$users数组 array_multisort($ages, SORT_ASC, $users); // 若需要按age降序排序(年龄从大到小),把参数里的SORT_ASC替换为SORT_DESC即可 // array_multisort($ages, SORT_DESC, $users);
排序完成后直接用foreach遍历$users,得到的就是按age排序后的结果,可直接处理后续业务逻辑:
foreach ($users as $user) { // 自定义业务处理逻辑 print_r($user); }
方法2:usort 自定义比较逻辑实现
如果需要更灵活的排序规则(比如age相同时按number字段二次排序),可以用usort自定义比较函数,兼容性更强:
// 按age升序排序 usort($users, function($a, $b) { return $a['age'] - $b['age']; }); // 按age降序排序 // usort($users, function($a, $b) { // return $b['age'] - $a['age']; // }); // 扩展:age相同时按number升序二次排序 // usort($users, function($a, $b) { // if ($a['age'] == $b['age']) { // return $a['number'] - $b['number']; // } // return $a['age'] - $b['age']; // });
注意事项
- 上述两个排序函数都是直接修改原数组,不需要把返回值赋值给新变量,函数返回的布尔值仅代表排序操作是否执行成功
- 如果调用
json_decode时没有传入第二个参数true,得到的是对象数组而非关联数组,排序时取值要改为对象属性写法,例如$a->age、$b->age - 若排序后需要保留原数组的键值关联关系,把
usort换成uasort即可 array_column函数要求PHP版本≥5.5,低于该版本的环境直接使用usort方案即可
按age升序排序后的结果参考
Array ( [0] => Array ( [number] => 2 [name] => mohammad hosseini [age] => 14 [school] => Andishe ) [1] => Array ( [number] => 3 [name] => Mohammad hosseini [age] => 14 [school] => Allame ) [2] => Array ( [number] => 1 [name] => masoud ahmadi [age] => 16 [school] => Amir kabir ) [3] => Array ( [number] => 4 [name] => ali akabr [age] => 16 [school] => Allame ) )
内容的提问来源于stack exchange,提问作者shahriar purmalek
相关产品推荐
相关产品推荐

