如何在PHP中对存在关联依赖的多数组进行排序?
实现关联依赖数组的列对齐排序
核心思路
我们需要根据主依赖数组定义的关联关系,将不同数组中关联的值调整到同一列位置,未关联的值填充到剩余位置。步骤如下:
- 构建值到目标列的映射表,根据主依赖数组给每个关联组分配列索引。
- 以指定基准数组(示例中为
array1)的元素位置修正映射,确保基准数组顺序不变。 - 遍历每个数组,先放置有映射的元素到目标列,再将未关联元素填充到空位置。
PHP 代码实现
<?php // 原始数组 $array1 = [1, 2, 3, 4, 5]; $array2 = [6, 7, 8, 9, 10]; $array3 = [11, 12, 13, 14, 15]; $allArrays = [$array1, $array2, $array3]; // 主依赖数组(关联关系定义) $sortGroups = [[1,7,13],[2,6,11],[1,8,15]]; // 步骤1:构建值到目标列的初始映射 $valueToColumn = []; foreach ($sortGroups as $columnIndex => $group) { foreach ($group as $value) { $valueToColumn[$value] = $columnIndex; } } // 步骤2:用基准数组(array1)的位置修正映射,保证基准数组顺序不变 foreach ($array1 as $index => $value) { if (isset($valueToColumn[$value])) { $valueToColumn[$value] = $index; } } // 步骤3:处理每个数组,生成排序后的结果 $sortedArrays = []; foreach ($allArrays as $arr) { $result = array_fill(0, count($arr), null); $remaining = []; // 先放置有映射的元素 foreach ($arr as $value) { if (isset($valueToColumn[$value])) { $col = $valueToColumn[$value]; if ($result[$col] === null) { $result[$col] = $value; } else { // 若列位置已被占用,将元素转入剩余列表 $remaining[] = $value; } } else { $remaining[] = $value; } } // 填充剩余元素到空位置 $remainingIndex = 0; foreach ($result as $i => $val) { if ($val === null) { $result[$i] = $remaining[$remainingIndex++]; } } $sortedArrays[] = $result; } // 输出结果 list($sortedArray1, $sortedArray2, $sortedArray3) = $sortedArrays; echo '$array1 = [' . implode(',', $sortedArray1) . '];' . PHP_EOL; echo '$array2 = [' . implode(',', $sortedArray2) . '];' . PHP_EOL; echo '$array3 = [' . implode(',', $sortedArray3) . '];' . PHP_EOL; ?>
代码说明
- 映射构建:先按主依赖组的顺序分配列索引,再用基准数组的元素位置修正,确保基准数组的元素位置不改变。
- 元素放置:优先将关联元素放到目标列,若出现列位置冲突(多个元素映射到同一列),则将冲突元素转入剩余列表。
- 剩余填充:将未关联或冲突的元素按原顺序填充到结果数组的空位置,也可通过打乱
$remaining数组实现随机填充。
运行代码后将得到预期结果:
$array1 = [1,2,3,4,5]; $array2 = [7,6,8,9,10]; $array3 = [13,11,15,12,14];
内容的提问来源于stack exchange,提问作者Johan Strömqvist
相关产品推荐
相关产品推荐

