PHP:如何按嵌套数组中Client的Name字段降序排序?
问题:嵌套数组中按子数组字段排序
原数组结构:
$array = [ [ 'project_id' => 1, 'Client' => [ ['Name' => 'Franco', 'Amount' => 1000.00], ['Name' => 'Allan', 'Amount' => 1000.00], ['Name' => 'Booby', 'Amount' => 1000.00] ], ], ];
需求:对Client数组内的元素按Name字段降序排序。
为什么你的代码没生效?
你之前的代码是对外层数组(包含project_id的那个数组)进行排序,但外层数组只有1个元素,排序没有意义。真正需要排序的是外层元素里的Client子数组。
解决方案1:使用usort
直接定位到Client数组,用自定义回调实现排序:
// 指向需要排序的Client数组 $clients = &$array[0]['Client']; usort($clients, function($a, $b) { // 字符串降序比较:用b的Name与a的Name对比 return strcmp($b['Name'], $a['Name']); }); // 输出结果 print_r($array);
执行后Client数组会变为:
[ ['Name' => 'Franco', 'Amount' => 1000.00], ['Name' => 'Booby', 'Amount' => 1000.00], ['Name' => 'Allan', 'Amount' => 1000.00] ]
解决方案2:使用array_multisort
先提取Name字段作为排序键,再关联排序原数组:
// 提取所有Client的Name字段 $names = array_column($array[0]['Client'], 'Name'); // 按Name降序排序,同时同步排序Client数组 array_multisort($names, SORT_DESC, SORT_STRING, $array[0]['Client']); print_r($array);
如果外层有多个项目(多project)
如果数组包含多个project_id元素,循环处理每个项目的Client即可:
foreach ($array as &$project) { usort($project['Client'], function($a, $b) { return strcmp($b['Name'], $a['Name']); }); } unset($project); // 释放引用避免后续操作异常
内容的提问来源于stack exchange,提问作者Not a Pro
相关产品推荐
相关产品推荐

