PHP中根据指定数组对两个数据数组进行排序
按指定分组顺序排序关联数组的解决方案
我明白你的需求啦——你想要按照给定的分组顺序,把两个一一对应的数组(分组数组和数据数组)重新排序,而且之前尝试用array_multisort没成功对吧?别担心,这里有两种靠谱的方法可以实现:
方法一:组合关联数组后自定义排序
这种方法先把两个数组的对应元素组合成关联数组,再根据指定的分组顺序自定义排序,最后拆分回原数组结构,逻辑非常直观:
// 你的原始数据 $array1 = ['group1','group1','group3','group1','group2']; $array2 = ['data1','data3','data2','data4','data5']; $sortArray = ['group2','group1','group3']; // 先给每个分组分配排序优先级:把sortArray转成「分组名 => 排序索引」的映射 $sortPriority = array_flip($sortArray); // 将两个数组的对应元素组合成关联数组,方便后续排序 $combinedData = array_map(function($group, $data) { return ['group' => $group, 'data' => $data]; }, $array1, $array2); // 按照分组的优先级排序组合数组 usort($combinedData, function($itemA, $itemB) use ($sortPriority) { // 用优先级的差值决定排序顺序,优先级小的排在前面 return $sortPriority[$itemA['group']] - $sortPriority[$itemB['group']]; }); // 把排序后的组合数组拆回两个独立数组 $sortedGroups = array_column($combinedData, 'group'); $sortedData = array_column($combinedData, 'data'); // 查看结果 print_r($sortedGroups); print_r($sortedData);
输出结果完全符合你的预期:
Array ( [0] => group2 [1] => group1 [2] => group1 [3] => group1 [4] => group3 ) Array ( [0] => data5 [1] => data1 [2] => data3 [3] => data4 [4] => data2 )
方法二:正确使用array_multisort
你之前用array_multisort没成功,大概率是没生成对应的排序键数组。我们需要先创建一个和array1等长的数组,每个元素是对应分组在sortArray中的索引,再用这个数组作为排序依据来同步排序两个数组:
// 你的原始数据 $array1 = ['group1','group1','group3','group1','group2']; $array2 = ['data1','data3','data2','data4','data5']; $sortArray = ['group2','group1','group3']; // 构建分组到排序索引的映射 $sortPriority = array_flip($sortArray); // 生成和array1等长的排序键数组 $sortKeys = array_map(function($group) use ($sortPriority) { return $sortPriority[$group]; }, $array1); // 用array_multisort同步排序:先按sortKeys排序,再同步调整array1和array2的顺序 array_multisort($sortKeys, SORT_ASC, $array1, $array2); // 查看结果 print_r($array1); print_r($array2);
这个方法直接利用PHP原生的排序函数,在处理大数据量时性能会更优。
小提示
两种方法都能保证相同分组的元素保留原来的相对顺序(PHP 7.0+的usort是稳定排序,array_multisort也会保持相同排序键元素的原顺序),完全符合你的需求。
内容的提问来源于stack exchange,提问作者gregpress
相关产品推荐
相关产品推荐

