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

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


当前回答

解决:

要删除一个元素,请使用unset():

未设置($array[3]);unset($array['fo']);

要删除多个不连续的元素,还可以使用unset():

未设置($array[3],$array[5]);取消设置($array['fo'],$array['bar']);

要删除多个连续元素,请使用array_splice():

array_拼接($array,$offset,$length);

进一步解释:

使用这些函数可以从PHP中删除对这些元素的所有引用。如果要在数组中保留一个键,但该键的值为空,请将空字符串分配给元素:

$array[3] = $array['foo'] = '';

除了语法之外,使用unset()和将“”赋值给元素之间还有逻辑上的区别。第一个表示This已不存在,而第二个表示This仍然存在,但其值为空字符串。

如果你在处理数字,分配0可能是更好的选择。因此,如果一家公司停止生产XL1000型链轮,它将更新库存:

unset($products['XL1000']);

然而,如果XL1000链轮暂时用完,但计划在本周晚些时候从工厂接收新的发货,则情况会更好:

$products['XL1000'] = 0;

如果取消设置()元素,PHP将调整数组,以便循环仍然正常工作。它不会压缩阵列以填充缺失的孔。这就是我们所说的所有数组都是关联的,即使它们看起来是数字。下面是一个示例:

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
print $animals[1];  // Prints 'bee'
print $animals[2];  // Prints 'cat'
count($animals);    // Returns 6

// unset()
unset($animals[1]); // Removes element $animals[1] = 'bee'
print $animals[1];  // Prints '' and throws an E_NOTICE error
print $animals[2];  // Still prints 'cat'
count($animals);    // Returns 5, even though $array[5] is 'fox'

// Add a new element
$animals[ ] = 'gnu'; // Add a new element (not Unix)
print $animals[1];  // Prints '', still empty
print $animals[6];  // Prints 'gnu', this is where 'gnu' ended up
count($animals);    // Returns 6

// Assign ''
$animals[2] = '';   // Zero out value
print $animals[2];  // Prints ''
count($animals);    // Returns 6, count does not decrease

要将数组压缩为填充密集的数字数组,请使用array_values():

$animals = array_values($animals);

或者,array_splice()会自动重新索引数组以避免留下洞:

// Create a "numeric" array
$animals = array('ant', 'bee', 'cat', 'dog', 'elk', 'fox');
array_splice($animals, 2, 2);
print_r($animals);
Array
(
    [0] => ant
    [1] => bee
    [2] => elk
    [3] => fox
)

如果您将数组用作队列,并希望从队列中删除项目,同时仍允许随机访问,则这非常有用。要安全地从数组中删除第一个或最后一个元素,请分别使用array_shift()和array_pop()。

其他回答

关联阵列

对于关联阵列,请使用unset:

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

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

数值数组

对于数值数组,请使用array_spling:

$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_filter()是最佳选择。那些从回调函数返回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()或\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
]

如果需要从关联数组中删除多个元素,可以使用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 ) 

如果指定了索引:

$arr = ['a', 'b', 'c'];
$index = 0;    
unset($arr[$index]);  // $arr = ['b', 'c']

如果我们有值而不是索引:

$arr = ['a', 'b', 'c'];

// search the value to find index
// Notice! this will only find the first occurrence of value
$index = array_search('a', $arr);

if($index !== false){
   unset($arr[$index]);  // $arr = ['b', 'c']
}

if条件是必要的因为如果找不到索引,unset()将自动删除数组的第一个元素,这不是我们想要的。