PHP中Splatpacking与array_values()重索引数字键数组的选型对比
PHP数组重索引:array_values() vs Splatpacking([...])怎么选?
嘿,关于PHP里这两种数组重索引的方法,我来给你掰扯清楚怎么选~
首先先回顾下这俩方法的基本情况:从PHP7.4开始,我们可以用Splatpacking(也就是[...]展开运算符的方式)来给数字键数组重新索引,而传统的array_values()早就从PHP4开始就存在了。在纯数字键(包括字符串形式的数字、会被转成整数的浮点数键)的数组里,两者的输出完全一致,比如:
$array = [2 => 4, 5 => 3, "3" => null, -10.9 => 'foo']; var_export(array_values($array)); var_export([...$array]);
两者都会输出:
array ( 0 => 4, 1 => 3, 2 => NULL, 3 => 'foo', )
那到底该怎么选?其实核心看你的场景需求:
1. 兼容性优先?选array_values()
如果你的项目需要兼容PHP7.4以下的版本,那array_values是唯一选择——毕竟它是个老牌内置函数,几乎所有PHP环境都支持。就算团队里有新手,也大概率认识这个函数,学习成本更低。
2. 代码简洁+环境允许?选Splatpacking
如果你的项目已经跑在PHP7.4及以上,而且数组都是纯数字键的场景,[...]的写法明显更简洁清爽。比如在链式调用里,some_function([...$myArray])比some_function(array_values($myArray))少敲好几个字符,看起来也更直观。当然前提是团队成员都了解这个语法,避免有人看不懂。
3. 数组有混合键?得看需求
这是两者最关键的差异点:
- 如果你的数组混合了数字键和非数字字符串键,
array_values()会无视所有原键,直接把所有值按顺序重索引成0、1、2...; - 而
[...]会保留非数字字符串键,只对数字键的元素重新索引。举个例子:
所以如果需要保留非数字键,同时重索引数字键,那只能用Splatpacking;如果要提取所有值并重索引,就必须用array_values()。$mixedArray = [2 => 'foo', 'bar' => 'baz', 5 => 'qux']; var_export(array_values($mixedArray)); // 输出:array(0 => 'foo', 1 => 'baz', 2 => 'qux') var_export([...$mixedArray]); // 输出:array(0 => 'foo', 'bar' => 'baz', 1 => 'qux')
4. 性能?几乎不用纠结
在大多数业务场景下,两者的性能差异微乎其微,哪怕是处理大数组,你也很难感受到区别。硬要抠的话,array_values()作为内置函数可能略快一丢丢,但完全不值得为这点差异改变写法。
总结一下:
- 兼容旧版本 → array_values()
- PHP7.4+ + 纯数字键数组 + 追求简洁 → [...]
- 需要提取所有值重索引 → array_values()
- 要保留非数字键同时重索引数字键 → [...]
内容的提问来源于stack exchange,提问作者mickmackusa
相关产品推荐
相关产品推荐

