如何删除数组元素然后重新索引数组?

时间:2011-03-07 09:04:21

标签: php arrays indexing

我有阵列的麻烦。我有一个我想要修改的数组,如下所示。我想通过索引删除它的元素(元素),然后重新索引数组。有可能吗?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

10 个答案:

答案 0 :(得分:418)

unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

答案 1 :(得分:39)

答案 2 :(得分:28)

您最好使用 array_shift() 。这将返回数组的第一个元素,将其从数组中删除并重新索引数组。一体化的方法。

答案 3 :(得分:9)

array_splice($array, array_search(array_value,$array),1);

答案 4 :(得分:4)

Unset($array[0]); 

Sort($array); 

我不知道为什么会被投票,但如果有人费心去尝试,你会发现它有效。 在数组上使用sort会重新分配数组的键。唯一的缺点是它对值进行排序。 由于密钥显然会被重新分配,即使使用array_values,因此值的排序也无关紧要。

答案 5 :(得分:3)

尝试:

$foo2 = array_slice($foo, 1);

答案 6 :(得分:2)

PHP 7.4中的2020年基准测试

对于那些对当前答案不满意的人,我做了一个基准测试脚本,任何人都可以从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"; 

如您所见,这个想法很简单:

  • 创建两个数组,每个数组都具有相同的100k项(随机生成的字符串)
  • 使用unset()和array_values()从第一个数组中删除10k首项以重新索引
  • 使用array_splice()从第二个数组中删除1万个第一项
  • 测量两种方法的时间

上面的脚本在我的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是赢家!

答案 7 :(得分:1)

如果您使用array_merge,则会重新索引密钥。手册说明:

  

带有数字键的输入数组中的值将重新编号   在结果数组中从零开始递增键。

http://php.net/manual/en/function.array-merge.php

这是我找到原始答案的地方。

http://board.phpbuilder.com/showthread.php?10299961-Reset-index-on-array-after-unset()

答案 8 :(得分:0)

除了xzyfer的回答

功能

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

使用

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

<强>结果

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

答案 9 :(得分:0)

一段时间后,我会将所有数组元素(不包括这些不需要的)复制到新数组中