在 PHP 中从数组中删除一个元素

新手上路,请多包涵

有没有一种简单的方法可以使用 PHP 从数组中删除一个元素,这样 foreach ($array) 不再包含该元素?

我认为将其设置为 null 会做到这一点,但显然它不起作用。

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 739
2 个回答

删除数组元素有多种方法,其中有些方法对某些特定任务比其他方法更有用。

删除单个数组元素

如果您只想删除一个数组元素,可以使用 unset()\array_splice()

如果您知道值并且不知道删除元素的键,您可以使用 \array_search() 来获取键。这仅在元素不出现多次时才有效,因为 \array_search 仅返回第一次命中。

unset()

请注意,当您使用 unset() 时,数组键不会改变。如果要重新索引键,可以在 \array_values() 之后使用 --- unset() ,这会将所有键转换为从 0 开始的数字枚举键。

代码:

 $array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
          // ↑ Key which you want to delete

输出:

 [
    [0] => a
    [2] => c
]

\array_splice() 方法

如果您使用 \array_splice() 键将自动重新索引,但关联键不会更改 - 而 \array_values() 会将所有键转换为数字键。

\array_splice() 需要 offset ,而不是 key ,作为第二个参数。

代码:

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

输出:

 [
    [0] => a
    [1] => c
]

array_splice()unset() 引用数组。您不会将这些函数的返回值分配回数组。

删除多个数组元素

If you want to delete multiple array elements and don’t want to call unset() or \array_splice() multiple times you can use the functions \array_diff() or \array_diff_key() 取决于您是否知道要删除的元素的值或键。

\array_diff() 方法

如果您知道要删除的数组元素的值,则可以使用 \array_diff() 。与 unset() 之前一样,它不会更改数组的键。

代码:

 $array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = \array_diff($array, ["a", "c"]);
                          // └────────┘
                          // Array values which you want to delete

输出:

 [
    [1] => b
]

\array_diff_key() 方法

如果您知道要删除的元素的键,那么您想使用 \array_diff_key() 。您必须确保将键作为第二个参数中的键而不是值传递。键不会重新索引。

代码:

 $array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                               // ↑           ↑
                               // Array keys which you want to delete

输出:

 [
    [1] => b
]

如果要使用 unset()\array_splice() 删除具有相同值的多个元素,可以使用 \array_keys() 获取特定值的所有键,然后删除所有元素。

\array_filter() 方法

如果要删除数组中具有特定值的所有元素,可以使用 \array_filter()

代码:

 $array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_filter($array, static function ($element) {
    return $element !== "b";
    //                   ↑
    // Array value which you want to delete
});

输出:

 [
    [0] => a
    [1] => c
]

原文由 Konrad Rudolph 发布,翻译遵循 CC BY-SA 4.0 许可协议

编辑

如果您不能认为该对象在该数组中,则需要添加一个检查:

 if(in_array($object,$array)) unset($array[array_search($object,$array)]);

原始答案

如果您想通过引用该对象来删除数组的特定对象,您可以执行以下操作:

 unset($array[array_search($object,$array)]);

例子:

 <?php
class Foo
{
    public $id;
    public $name;
}

$foo1 = new Foo();
$foo1->id = 1;
$foo1->name = 'Name1';

$foo2 = new Foo();
$foo2->id = 2;
$foo2->name = 'Name2';

$foo3 = new Foo();
$foo3->id = 3;
$foo3->name = 'Name3';

$array = array($foo1,$foo2,$foo3);
unset($array[array_search($foo2,$array)]);

echo '<pre>';
var_dump($array);
echo '</pre>';
?>

结果:

 array(2) {
[0]=>
    object(Foo)#1 (2) {
        ["id"]=>
        int(1)
        ["name"]=>
        string(5) "Name1"
    }
[2]=>
    object(Foo)#3 (2) {
        ["id"]=>
        int(3)
        ["name"]=>
        string(5) "Name3"
    }
}

请注意,如果对象多次出现,则只会在第一次出现时将其删除!

原文由 Sam Tigle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题