我有一个数组的问题。我想要修改这个数组如下。我希望通过索引来移除数组中的某些元素,然后重新对数组进行索引。是否可能?
$foo = array(
'whatever', // [0]
'foo', // [1]
'bar' // [2]
);
$foo2 = array(
'foo', // [0], before [1]
'bar' // [1], before [2]
);
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array
array_splice($array, 0, 1);
你最好使用 array_shift()
。它会返回数组的第一个元素,将其从数组中移除并重新索引数组。这是一种高效的方法。
array_pop()
将实现此功能。但是,这两个函数都不能针对数组中间的元素执行操作。 - Derrick Millerarray_splice($array, array_search(array_value, $array), 1);
2020 PHP 7.4性能基准测试
对于那些对当前答案不满意的人,我写了一个小的基准测试脚本,任何人都可以从CLI运行。
我们将比较两种解决方案:
使用array_values()和unset()与使用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";
正如您所看到的,这个思路很简单:
在我的Dell Latitude i7-6600U 2.60GHz x 4和15.5GiB RAM上运行上述脚本的输出:
php v7.4.8
unset & array_values: 29.089932918549s
array_splice: 17.94264793396s
结论:array_splice 的性能几乎是 unset 和 array_values 的两倍。
因此:array_splice 胜出!
Unset($array[0]);
Sort($array);
我不知道为什么这个被踩了,但如果有人尝试过,你会注意到它是有效的。
在数组上使用sort会重新分配数组的键。唯一的缺点是它对值进行排序。
由于键显然将被重新分配,即使使用array_values
,值是否被排序都无关紧要。
尝试以下操作:
$foo2 = array_slice($foo, 1);
过一段时间后,我将把所有数组元素(不包括这些不需要的元素)复制到新数组中
unset($foo[0], $foo[3], $bar[1]);
。 - ᴍᴀᴛᴛ ʙᴀᴋᴇʀ