daG*_*vis 203 php arrays indexing
我有阵列的麻烦.我有一个我想要修改的数组,如下所示.我想通过索引删除它的元素(元素),然后重新索引数组.可能吗?
$foo = array(
'whatever', // [0]
'foo', // [1]
'bar' // [2]
);
$foo2 = array(
'foo', // [0], before [1]
'bar' // [1], before [2]
);
Run Code Online (Sandbox Code Playgroud)
xzy*_*fer 449
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
Run Code Online (Sandbox Code Playgroud)
dec*_*eze 41
array_splice($array, 0, 1);
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/en/function.array-splice.php
小智 28
你最好用array_shift()
.这将返回数组的第一个元素,将其从数组中删除并重新索引数组.一体化的有效方法.
小智 9
array_splice($array, array_search(array_value,$array),1);
Run Code Online (Sandbox Code Playgroud)
Unset($array[0]);
Sort($array);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么要拒绝它,但是如果有人不愿意尝试它,您会注意到它可行。在数组上使用sort会重新分配数组的键。唯一的缺点是它对值进行排序。由于显然可以重新分配键,即使使用array_values
,也可以对值进行排序与否。
2020 年 PHP 7.4 基准测试
对于那些对当前答案不满意的人,我做了一个小基准脚本,任何人都可以从 CLI 运行。
我们将比较两种解决方案:
unset() 与 array_values() VS array_splice()。
<?php
echo 'php v' . phpversion() . "\n";
$itemsOne = [];
$itemsTwo = [];
// populate items array with 100k random strings
for ($i = 0; $i < 100000; $i++) {
$itemsOne[] = $itemsTwo[] = sha1(uniqid(true));
}
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
unset($itemsOne[$i]);
$itemsOne = array_values($itemsOne);
}
$end = microtime(true);
echo 'unset & array_values: ' . ($end - $start) . 's' . "\n";
$start = microtime(true);
for ($i = 0; $i < 10000; $i++) {
array_splice($itemsTwo, $i, 1);
}
$end = microtime(true);
echo 'array_splice: ' . ($end - $start) . 's' . "\n";
Run Code Online (Sandbox Code Playgroud)
如您所见,这个想法很简单:
以上脚本在我的戴尔 Latitude i7-6600U 2.60GHz x 4 和 15.5GiB RAM 上的输出:
php v7.4.8
unset & array_values: 29.089932918549s
array_splice: 17.94264793396s
Run Code Online (Sandbox Code Playgroud)
结论:array_splice 的性能几乎是 unset 和 array_values 的两倍。
所以:array_splice 是赢家!