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
相关产品推荐
相关产品推荐

