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

PHP中实现保留键名的数组元素全排列问题

解决PHP数组全排列保留键名的问题

你的函数核心逻辑是对的,但问题出在array_merge函数的特性上:PHP中array_merge会重置数字类型的索引,导致原本的键名被覆盖成连续的0、1、2...,从而丢失了原有的键名关联。

修正方案

把所有array_merge替换为数组相加运算符+,或者直接向处理中数组添加键值对。数组相加会严格保留两边数组的键名,不会重置数字索引。

修正后的函数

function permutations($inArray, &$returnArray = [], $inProcessedArray = [])
{
    if (count($inArray) === 1)
    {
        // 用数组相加替代array_merge,保留键名
        $returnArray[] = $inProcessedArray + $inArray;
    }
    else
    {
        foreach($inArray as $key => $value)
        {
            $copyArray = $inArray;
            unset($copyArray[$key]);
            // 直接构建新的处理数组,避免array_merge重置数字键
            $newProcessed = $inProcessedArray;
            $newProcessed[$key] = $value;
            permutations($copyArray, $returnArray, $newProcessed);
        }
    }
}

测试示例

调用函数并输出结果:

$original = [0 => 'перший', 1 => 'другий', 2 => 'третій'];
$perms = [];
permutations($original, $perms);

foreach ($perms as $perm) {
    var_export($perm);
    echo ",\n";
}

输出结果会完全符合你要求的保留键名的全排列:

array (
  0 => 'перший',
  1 => 'другий',
  2 => 'третій',
),
array (
  0 => 'перший',
  2 => 'третій',
  1 => 'другий',
),
array (
  1 => 'другий',
  0 => 'перший',
  2 => 'третій',
),
array (
  1 => 'другий',
  2 => 'третій',
  0 => 'перший',
),
array (
  2 => 'третій',
  0 => 'перший',
  1 => 'другий',
),
array (
  2 => 'третій',
  1 => 'другий',
  0 => 'перший',
),

内容的提问来源于stack exchange,提问作者deadmoz5er

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:06:57