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

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...;
  • 而[...]会保留非数字字符串键,只对数字键的元素重新索引。举个例子:
    $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')
    
    所以如果需要保留非数字键,同时重索引数字键,那只能用Splatpacking;如果要提取所有值并重索引,就必须用array_values()。

4. 性能?几乎不用纠结

在大多数业务场景下,两者的性能差异微乎其微,哪怕是处理大数组,你也很难感受到区别。硬要抠的话,array_values()作为内置函数可能略快一丢丢,但完全不值得为这点差异改变写法。

总结一下:

  • 兼容旧版本 → array_values()
  • PHP7.4+ + 纯数字键数组 + 追求简洁 → [...]
  • 需要提取所有值重索引 → array_values()
  • 要保留非数字键同时重索引数字键 → [...]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:17:43