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


206

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

$foo = array(

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

);

$foo2 = array(

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

);

Answers:


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

6
这正是我想发布的内容,+ 1。
Michiel Pater

4
如果需要一次删除多个项目-如果这些项目的索引是事先收集的,则这比deceze的解决方案更好。在第一个项目上使用array_splice之后,您将丢失其余项目的索引。
亚尼斯Elmeris

23
可能值得注意的是,您可以在一个未设置的调用中取消设置多个变量/数组索引unset($foo[0], $foo[3], $bar[1]);
2014年

非常好的解决方案兄弟:)
Michael Kisilenko 2014年

我用这个 谢谢。我正在使用array_splice,但不适用于第0个和第1个索引。
theGreenCabbage


29

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


2
当您要检索然后删除第一个数组元素,并在过程中为数组重新索引时,这很好。array_pop()如果需要,它的对应函数将检索并删除最后一个数组元素。但是,两个函数都不能作用于数组中间的元素。
德里克·米勒

1
虽然这是正交相关的,但问题明确地是关于数组的任何元素,而不仅仅是第一个。
费利克斯·加侬-格雷尼尔


9
Unset($array[0]); 

Sort($array); 

我不知道为什么要拒​​绝这样做,但是如果有人不愿意尝试它,您会注意到它可行。在数组上使用sort会重新分配数组的键。唯一的缺点是它对值进行排序。由于显然可以重新分配键,即使使用array_values,也可以对值进行排序与​​否。


9
即使重新分配了按键,也将以正确的答案保留初始顺序。
s3v3n 2011年

1
“我想通过索引删除其元素(元素),然后重新索引数组。这可能吗?” @ s3v3n OP从未要求维护初始订单。我只是提供了一个行之有效的解决方案,并按照说明进行操作。
frostymarvelous 2014年

1
问题是2岁。放手吧!
s3v3n 2014年

@ s3v3n这不是怨恨。我只想知道为什么。显然在以后的答案中有所改善。我同意有更好的方法,但是这个答案有那么糟糕吗?是表演吗?等等?我在学习和教学上都一样的理由。
frostymarvelous 2014年

在正常情况下,程序员很有可能会需要与输入完全相同的顺序的那些值。让我们以数据库中应显示在表中的某些行为例。或聊天应用程序,其中回复应以完全相同的顺序进行。示例的数量可以是无限的,关键是在大多数情况下顺序必须相同,或者至少程序员希望数组中元素的顺序相同。
s3v3n 2014年

4

尝试:

$foo2 = array_slice($foo, 1);

这仅适用于第一个元素,而不适用于任意元素。
Felix Kling

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"
  }

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.