在PHP中删除数组中的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PHP中删除数组中的元素相关的知识,希望对你有一定的参考价值。

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

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

答案

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

Delete one array element

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

此外,如果您有值并且不知道删除元素的键,您可以使用\array_search()来获取密钥。

\unset() method

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

<?php

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

?>

产量

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

\array_splice() method

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

\array_splice()也需要偏移,而不是关键!作为第二个参数。

<?php

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

Delete multiple array elements

如果要删除多个数组元素并且不想多次调用\unset()\array_splice(),则可以使用函数\array_diff()\array_diff_key(),具体取决于您是否知道要删除的元素的值或键。

\array_diff() method

如果您知道要删除的数组元素的值,则可以使用\array_diff()。和之前的\unset()一样,它不会改变/重新索引数组的键。

<?php

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

?>

产量

[
    [1] => b
]

\array_diff_key() method

如果您知道要删除的元素的键,则需要使用\array_diff_key()。在这里,您必须确保将键作为键传递给第二个参数而不是值。否则,你必须用\array_flip()翻转数组。而且这里的密钥不会改变/重新索引。

<?php

    $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_diff

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

在这种情况下,不必搜索/使用密钥。

另一答案

如果您必须删除数组中的多个值,并且该数组中的条目是对象或结构化数据,那么[array_filter][1]是您最好的选择。将保留那些从回调函数返回true的条目。

$array = [
    ['x'=>1,'y'=>2,'z'=>3], 
    ['x'=>2,'y'=>4,'z'=>6], 
    ['x'=>3,'y'=>6,'z'=>9]
];

$results = array_filter($array, function($value) 
    return $value['x'] > 2; 
); //=> [['x'=>3,'y'=>6,z=>'9']]
另一答案

unset()破坏了指定的变量。

unset()在函数内部的行为可能会有所不同,具体取决于您试图销毁的变量类型。

如果全局化变量是函数内部的unset(),则仅销毁局部变量。调用环境中的变量将保留与调用unset()之前相同的值。

<?php
    function destroy_foo()
    
        global $foo;
        unset($foo);
    

    $foo = 'bar';
    destroy_foo();
    echo $foo;
?>

上面代码的答案将是吧。

unset()一个函数内部的全局变量:

<?php
    function foo()
    
        unset($GLOBALS['bar']);
    

    $bar = "something";
    foo();
?>
另一答案

关联数组

对于关联数组,请使用unset

$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);

// RESULT: array('a' => 1, 'c' => 3)

数字数组

对于数值数组,请使用array_splice

$arr = array(1, 2, 3);
array_splice($arr, 1, 1);

// RESULT: array(0 => 1, 1 => 3)

Note

使用unset作为数值数组不会产生错误,但它会搞乱你的索引:

$arr = array(1, 2, 3);
unset($arr[1]);

// RESULT: array(0 => 1, 2 => 3)
另一答案

如果需要从关联数组中删除多个元素,可以使用array_diff_key()(此处与array_flip()一起使用):

$my_array = array(
  "key1" => "value 1",
  "key2" => "value 2",
  "key3" => "value 3",
  "key4" => "value 4",
  "key5" => "value 5",
);

$to_remove = array("key2", "key4");

$result = array_diff_key($my_array, array_flip($to_remove));

print_r($result);

输出:

Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 ) 
另一答案
// Remove by value
function removeFromArr($arr, $val)

    unset($arr[array_search($val, $arr)]);
    return array_values($arr);

另一答案

假设您有以下数组:

Array
(
    [user_id] => 193
    [storage] => 5
)

要删除storage,请执行以下操作:

unset($attributes['storage']);
$attributes = array_filter($attributes);

你得到:

Array
(
    [user_id] => 193
)
另一答案

我只想说我有一个具有变量属性的特定对象(它基本上映射了一个表,我正在更改表中的列,因此反映表的对象中的属性也会有所不同):

class obj 
    protected $fields = array('field1','field2');
    protected $field1 = array();
    protected $field2 = array();
    protected loadfields()
    // This will load the $field1 and $field2 with rows of data for the column they describe
    protected function clearFields($num)
        foreach($fields as $field) 
            unset($this->$field[$num]);
            // This did not work the line below worked
            unset($this->$field[$num]); // You have to resolve $field first using 
        
    

$fields的整个目的只是,所以当它们被改变时我不必在代码中到处查看,我只看一下类的开头并更改属性列表和$ fields数组内容以反映新属性。

另一答案

遵循默认功能:

一世)

$Array = array("test1", "test2", "test3", "test3");

unset($Array[2]);

II)

$Array = array("test1", "test2", "test3", "test3");

array_pop($Array);
以上是关于在PHP中删除数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

php数组元素值的修改和删除问题

PHP数组中,如何查询所有等于指定值得元素下标?

php如何删除两个数组中相同的元素

PHP学习记录数组中的数组的指针

php 编程 :怎样把数组中的元素按键名大小排列

PHP如何在数组指定位置插入元素