在php开发中,数组顺序调整是常见需求,array_reverse是官方提供的用于颠倒数组顺序的内置函数,掌握它的不同使用方式以及多维数组的反转技巧,能大幅提升开发效率。

array_reverse基础用法
array_reverse函数的基本语法为array_reverse(array $array, bool $preserve_keys = false): array,第一个参数是需要反转的数组,第二个参数表示是否保留原数组的键名,默认值为false。
先来看一个简单的索引数组反转示例:
<?php // 索引数组示例 $index_array = [1, 2, 3, 4, 5]; $reversed_index = array_reverse($index_array); print_r($reversed_index); ?>
上述代码的输出结果为:
Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
[4] => 1
)
保留键名的反转技巧
默认情况下array_reverse会重置数字索引,如果我们需要保留原数组的键名,只需要将第二个参数设置为true即可。这个特性在处理关联数组或者需要保留键名映射的场景下非常实用。
下面是保留键名的示例:
<?php // 关联数组示例 $assoc_array = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry']; $reversed_assoc = array_reverse($assoc_array, true); print_r($reversed_assoc); // 数字键名保留示例 $num_key_array = [10 => 'ten', 20 => 'twenty', 30 => 'thirty']; $reversed_num_key = array_reverse($num_key_array, true); print_r($reversed_num_key); ?>
第一个关联数组的输出结果为:
Array
(
[c] => cherry
[b] => banana
[a] => apple
)
第二个数字键名数组的输出结果为:
Array
(
[30] => thirty
[20] => twenty
[10] => ten
)
多维数组递归反转实现
array_reverse只能处理一维数组,如果遇到多维数组,它只会反转第一层的元素顺序,不会深入处理子数组。这时候我们需要自定义递归函数来实现多维数组的完全反转。
递归反转的核心思路是:遍历数组的每个元素,如果元素是数组,就递归调用反转函数,否则保留原元素,最后将处理后的数组整体反转。
下面是完整的递归反转函数实现:
<?php
/**
* 递归反转多维数组
* @param array $array 需要反转的数组
* @param bool $preserve_keys 是否保留键名
* @return array 反转后的数组
*/
function recursive_array_reverse(array $array, bool $preserve_keys = false): array {
$result = [];
foreach ($array as $key => $value) {
// 如果当前值是数组,递归处理
if (is_array($value)) {
$value = recursive_array_reverse($value, $preserve_keys);
}
// 根据是否保留键名决定存储方式
if ($preserve_keys) {
$result[$key] = $value;
} else {
$result[] = $value;
}
}
// 反转当前层级的数组
return array_reverse($result, $preserve_keys);
}
// 测试多维数组
$multi_array = [
'first' => ['a' => 1, 'b' => 2],
'second' => ['c' => 3, 'd' => ['x' => 10, 'y' => 20]],
'third' => 4
];
// 不保留键名反转
$reversed_multi = recursive_array_reverse($multi_array, false);
print_r($reversed_multi);
echo "-------------------n";
// 保留键名反转
$reversed_multi_preserve = recursive_array_reverse($multi_array, true);
print_r($reversed_multi_preserve);
?>
不保留键名的输出结果为:
Array
(
[0] => 4
[1] => Array
(
[0] => 20
[1] => 10
)
[2] => Array
(
[0] => 2
[1] => 1
)
)
保留键名的输出结果为:
Array
(
[third] => 4
[second] => Array
(
[d] => Array
(
[y] => 20
[x] => 10
)
[c] => 3
)
[first] => Array
(
[b] => 2
[a] => 1
)
)
使用注意事项
- array_reverse不会修改原数组,而是返回一个新的反转后的数组,原数组的值保持不变。
- 当第二个参数为false时,数字键名会被重置为从0开始的连续索引,字符串键名不受影响。
- 递归反转函数处理大维度、大体积的数组时可能会有性能损耗,如果对性能要求较高的场景,需要评估是否必要使用递归反转。
- 如果数组中包含对象元素,递归函数不会处理对象内部的属性顺序,只会处理数组类型的元素。
常见场景对比
不同场景下的数组反转方案选择可以参考下表:
| 场景 | 推荐方案 | 优势 |
|---|---|---|
| 一维索引数组反转 | array_reverse($array) | 内置函数,性能最优 |
| 一维关联数组/需要保留键名 | array_reverse($array, true) | 保留原键名映射,逻辑清晰 |
| 多维数组完全反转 | 自定义递归反转函数 | 支持深层数组反转,灵活度高 |
array_reversephp数组反转保留键名多维数组递归反转修改时间:2026-07-03 22:09:14