You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中对存在关联依赖的多数组进行排序?

实现关联依赖数组的列对齐排序

核心思路

我们需要根据主依赖数组定义的关联关系,将不同数组中关联的值调整到同一列位置,未关联的值填充到剩余位置。步骤如下:

  1. 构建值到目标列的映射表,根据主依赖数组给每个关联组分配列索引。
  2. 以指定基准数组(示例中为array1)的元素位置修正映射,确保基准数组顺序不变。
  3. 遍历每个数组,先放置有映射的元素到目标列,再将未关联元素填充到空位置。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:05:25