[stackoverflow翻译] 删除数组中的元素——PHP

问:

有没有简便的方法可以从php数组中删除元素,使用 foreach ($array) 也不会遍历到被删的元素?

我原以为将元素的值设为null可以,但事实显然并非如此.


答:

删除一个数组元素有多个方法,有的方法在一些特殊的情况下会比其他的方法更有用.

删除一个数组元素

如果你仅仅想删除一个数组元素,你可以交替使用 unset() array_splice().

如果你想删除一个数组元素但只知道他的 value 而不知道 key ,你可以使用 array_search() 去获得key.

unset() 方法

需知使用unset() 后,数组不会重建索引.如果你想要重建索引可以在 unset() 之后使用 array_values()
此函数将把所有的key转变成从0开始的数字的枚举类型.

代码:
<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    unset($array[1]);
               //↑ 你想要删除元素的key

?>

输出:

Array (
    [0] => a
    [2] => c
)

array_splice() 方法

如果你使用 array_splice() 方法, key 的索引将会被自动重建, 但组合的key(associative keys)不会被改变,相反 array_values() 方法会将所有的key转变成枚举的数字型key.

array_splice() 需要偏移量作为第二个参数,而不是key.

代码:

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    array_splice($array, 1, 1);
                       //↑ Offset which you want to delete

?>

输出:

Array (
    [0] => a
    [1] => c
)

array_splice() unset() 一样通过引用来操作数组, 这意味着你不想指定返回值this means you don't want to assign the return values of those functions back to the array.

删除多个数组元素

如果你想删除多个数组元素,且不多次调用 unset() array_splice() .在知道元素的value或key的情况下可以分别使用 array_diff() array_diff_key() 方法.

array_diff() 方法

在知道欲删除元素的value时当使用此方法,使用后不重置数组索引.

代码:

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff($array, ["a", "c"]);
                              //└────────┘→ 要删除元素的value

?>

输出:

Array (
    [1] => b
)

array_diff_key() 方法

在知道欲删除元素的key时当使用此方法,使用后也不重置数组索引.请确保在第二个参数传入的是欲删除元素的key. 否则必须使用array_flip() 来反转数组.

代码:

<?php

    $array = array(0 => "a", 1 => "b", 2 => "c");
    $array = array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                   //↑           ↑ 要删除元素的key
?>

输出:

Array (
    [1] => b
)

如果你想用 unset() array_splice() 删除具有相同value的多个元素你可以使用 array_keys() 来获取那个特殊value的所有key.

问题链接: http://stackoverflow.com/questions/369602/delete-an-element-from-an-array
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值