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

我以为将其设置为null就可以了,但显然它不起作用。


当前回答

// Remove by value
function removeFromArr($arr, $val)
{
    unset($arr[array_search($val, $arr)]);
    return array_values($arr);
}

其他回答

需要注意的是,unset()将保持索引不变,这是使用字符串索引(数组作为哈希表)时所期望的,但在处理整数索引数组时可能会非常令人惊讶:

$array = array(0, 1, 2, 3);
unset($array[2]);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [3]=>
  int(3)
} */

$array = array(0, 1, 2, 3);
array_splice($array, 2, 1);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */

因此,如果您想规范化整数键,可以使用array_splice()。另一个选项是在unset()之后使用array_values():

$array = array(0, 1, 2, 3);

unset($array[2]);
$array = array_values($array);
var_dump($array);
/* array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
} */
<?php
    // If you want to remove a particular array element use this method
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");

    print_r($my_array);
    if (array_key_exists("key1", $my_array)) {
        unset($my_array['key1']);
        print_r($my_array);
    }
    else {
        echo "Key does not exist";
    }
?>

<?php
    //To remove first array element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1);
    print_r($new_array);
?>


<?php
    echo "<br/>    ";
    // To remove first array element to length
    // starts from first and remove two element
    $my_array = array("key1"=>"value 1", "key2"=>"value 2", "key3"=>"value 3");
    print_r($my_array);
    $new_array = array_slice($my_array, 1, 2);
    print_r($new_array);
?>

输出

 Array ( [key1] => value 1 [key2] => value 2 [key3] =>
 value 3 ) Array (    [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
 Array ( [key1] => value 1 [key2] => value 2 [key3] => value 3 )
 Array ( [key2] => value 2 [key3] => value 3 )
unset($array[$index]);

删除数组元素有不同的方法,其中一些方法对于某些特定任务比其他方法更有用。

删除单个数组元素

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

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

取消设置()

注意,当您使用unset()时,数组键不会改变。如果要重新索引键,可以在unset()之后使用\array_values(),这会将所有键转换为从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()需要偏移量,而不是键作为第二个参数。

代码:

$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()相同,通过引用获取数组。您不会将这些函数的返回值分配回数组。

删除多个数组元素

如果要删除多个数组元素,并且不想多次调用unset()或\array_splice(),则可以使用函数\array_diff()或@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
]

Edit

如果无法将其视为对象位于该数组中,则需要添加检查:

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

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