在PHP开发中,处理数组时经常遇到需要交换两个数组对应位置数值的需求,比如两个数组长度相同,需要将第一个数组的第n个元素和第二个数组的第n个元素互换值,下面介绍多种实现方式。

方法一:使用foreach循环遍历交换
这是最基础也最容易理解的实现方式,通过遍历数组的下标,逐个交换两个数组对应位置的值,适合所有PHP版本。
<?php
// 定义两个待交换的数组
$arr1 = [10, 20, 30, 40];
$arr2 = [1, 2, 3, 4];
// 遍历数组下标
foreach ($arr1 as $key => $value) {
// 临时存储第一个数组的当前值
$temp = $arr1[$key];
// 把第二个数组的当前值赋给第一个数组
$arr1[$key] = $arr2[$key];
// 把临时存储的第一个数组的值赋给第二个数组
$arr2[$key] = $temp;
}
// 输出交换后的结果
print_r($arr1); // 输出 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
print_r($arr2); // 输出 Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 )
?>
方法二:使用list和each组合交换
这种方式利用list可以同时给多个变量赋值,each可以获取数组当前指针位置的键和值,适合PHP7.2之前的版本,PHP7.2之后each函数已被废弃,不推荐使用。
<?php
$arr1 = [10, 20, 30, 40];
$arr2 = [1, 2, 3, 4];
// 重置两个数组的指针
reset($arr1);
reset($arr2);
// 循环遍历直到数组末尾
while (list($key1, $val1) = each($arr1)) {
// 获取第二个数组对应位置的值
list($key2, $val2) = each($arr2);
// 交换值
$arr1[$key1] = $val2;
$arr2[$key2] = $val1;
}
print_r($arr1);
print_r($arr2);
?>
方法三:使用array_map函数交换
array_map函数可以将回调函数作用到给定数组的单元上,通过回调函数同时处理两个数组的对应元素,实现数值交换,代码更简洁。
<?php
$arr1 = [10, 20, 30, 40];
$arr2 = [1, 2, 3, 4];
// 使用array_map交换两个数组的值
$result = array_map(function($a, $b) use (&$arr1, &$arr2) {
// 返回交换后的值数组
return [$b, $a];
}, $arr1, $arr2);
// 将结果赋值回原数组
foreach ($result as $key => $val) {
$arr1[$key] = $val[0];
$arr2[$key] = $val[1];
}
print_r($arr1);
print_r($arr2);
?>
方法四:使用array_combine和array_values组合
这种方法思路是将两个数组的值分别作为键和值生成新数组,再提取数组值实现交换,适合数组下标连续且从0开始的情况。
<?php $arr1 = [10, 20, 30, 40]; $arr2 = [1, 2, 3, 4]; // 用arr1的值作为键,arr2的值作为值生成临时数组 $tempArr = array_combine($arr1, $arr2); // 提取临时数组的键作为arr2的新值 $arr2 = array_keys($tempArr); // 提取临时数组的值作为arr1的新值 $arr1 = array_values($tempArr); print_r($arr1); print_r($arr2); ?>
不同方法的适用场景
- 如果数组长度不一致,优先使用foreach循环,可以在循环中加入长度判断逻辑,避免下标越界错误
- 如果追求代码简洁且PHP版本支持,可选择array_map的写法,减少冗余代码
- 如果是简单的连续下标数组,array_combine组合的方式可以实现一行代码完成交换
- 如果使用的是PHP7.2及以上版本,不要使用each相关的写法,避免函数废弃带来的兼容性问题
注意事项
交换数组数值前需要先确认两个数组的长度是否一致,如果不一致直接交换会导致部分下标不存在,出现未定义偏移量的错误。如果数组长度不一致,可以提前用array_pad函数将两个数组补齐到相同长度,再进行交换操作。
<?php
$arr1 = [10, 20, 30];
$arr2 = [1, 2, 3, 4, 5];
// 将两个数组补齐到相同长度,缺失的位置用null填充
$maxLength = max(count($arr1), count($arr2));
$arr1 = array_pad($arr1, $maxLength, null);
$arr2 = array_pad($arr2, $maxLength, null);
// 再进行交换操作
foreach ($arr1 as $key => $value) {
$temp = $arr1[$key];
$arr1[$key] = $arr2[$key];
$arr2[$key] = $temp;
}
print_r($arr1);
print_r($arr2);
?>
PHP数组交换array_maparray_combineforeach循环修改时间:2026-06-13 08:24:30