有没有一种简便的方法可以使用PHP从数组中删除元素,从而foreach ($array)
不再包含该元素?
我以为将它设置为null
可以实现,但是显然不起作用。
有没有一种简便的方法可以使用PHP从数组中删除元素,从而foreach ($array)
不再包含该元素?
我以为将它设置为null
可以实现,但是显然不起作用。
Answers:
有多种删除数组元素的方法,其中某些方法对某些特定任务比其他任务更有用。
如果只想删除一个数组元素,则可以使用unset()
或\array_splice()
。
另外,如果您具有值并且不知道要删除元素的键,则可以使用\array_search()
该键来获取键。
unset()
请注意,使用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()
方法如果您使用\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()
通过引用获取数组,这意味着您不想将这些函数的返回值分配回数组。
如果你想删除多个数组元素,不想打电话unset()
或\array_splice()
多次,你可以使用的功能\array_diff()
或\array_diff_key()
取决于如果你知道的值或要删除的元素的键。
\array_diff()
方法如果知道要删除的数组元素的值,则可以使用\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()
方法如果知道要删除的元素的键,则要使用\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_splice
,如其他答案中所述。
array (3) { [0]=>int(0) ...
当你unset($x[2])
的$x = array(1, 2, 3, 4);
结果必须是var_dump($x); // array(3) { [0]=> int(1) [1]=> int(2) [3]=> int(4) }
(它可能是错字)
unset
可以有多个参数:void unset ( mixed $var [, mixed $... ] )
。
应当注意,这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()
如果您想标准化整数键,可以使用它。另一种选择是array_values()
在after之后使用unset()
:
$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)
} */
array_splice
在其他地方,这才是有意义的。
// Our initial array
$arr = array("blue", "green", "red", "yellow", "green", "orange", "yellow", "indigo", "red");
print_r($arr);
// Remove the elements who's values are yellow or red
$arr = array_diff($arr, array("yellow", "red"));
print_r($arr);
这是上面代码的输出:
Array
(
[0] => blue
[1] => green
[2] => red
[3] => yellow
[4] => green
[5] => orange
[6] => yellow
[7] => indigo
[8] => red
)
Array
(
[0] => blue
[1] => green
[4] => green
[5] => orange
[7] => indigo
)
现在,array_values()可以很好地为数字数组重新索引,但是它将删除数组中的所有键字符串,并将它们替换为数字。如果您需要保留键名(字符串),或者如果所有键都是数字键,则需要重新索引数组,请使用array_merge():
$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);
产出
Array
(
[0] => blue
[1] => green
[2] => green
[3] => orange
[4] => indigo
)
$key = array_search($needle, $array);
if ($key !== false) {
unset($array[$key]);
}
如果您有一个数字索引的数组,其中所有值都是唯一的(或者它们不是唯一的,但是您希望删除特定值的所有实例),则可以简单地使用array_diff()删除匹配的元素,如下所示:
$my_array = array_diff($my_array, array('Value_to_remove'));
例如:
$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);
显示以下内容:
4
3
在此示例中,值“ Charles”的元素被删除,可以通过sizeof()调用进行验证,该调用报告初始数组的大小为4,删除后的大小为3。
另外,对于命名元素:
unset($array["elementName"]);
$a = array("A"=>1, "B"=>2, "C"=>"a");
print_r($a);
unset($a["B"]);
print_r($a);
给出(格式化): Array ( [A] => 1 [B] => 2 [C] => a ), Array ( [A] => 1 [C] => a )
销毁数组的单个元素
unset()
$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);
输出将是:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[3]=>
string(1) "D"
[4]=>
string(1) "E"
}
如果需要重新索引数组:
$array1 = array_values($array1);
var_dump($array1);
然后输出将是:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "D"
[3]=>
string(1) "E"
}
从数组末尾弹出元素 -返回已删除元素的值
mixed array_pop(array &$array)
$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array
输出将是
Array
(
[0] => orange
[1] => banana
[2] => apple
)
Last Fruit: raspberry
从数组中删除第一个元素(红色),-返回已删除元素的值
mixed array_shift ( array &$array )
$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);
输出将是:
Array
(
[b] => green
[c] => blue
)
First Color: red
array_shift
重新索引,如果它的整数的关键项目,所以它的坏,所以你可以使用这个:stackoverflow.com/a/52826684/1407491
<?php
$stack = ["fruit1", "fruit2", "fruit3", "fruit4"];
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
输出:
[
[0] => fruit2
[1] => fruit3
[2] => fruit4
]
fruit1
array_shift
只能删除数组中的第一个元素。同样用于array_pop
删除数组中的最后一个元素。
为了避免进行搜索,您可以尝试array_diff
:
$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11
在这种情况下,不必搜索/使用密钥。
对于关联数组,请使用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)
使用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 )
unset()
销毁指定的变量。
unset()
函数内部的行为可能会有所不同,具体取决于您要破坏的变量类型。
如果unset()
全局变量在函数内部,则仅销毁局部变量。调用环境中的变量将保留与调用前相同的值unset()
。
<?php
function destroy_foo()
{
global $foo;
unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
以上代码的答案将是bar。
对于unset()
函数内部的全局变量:
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>
// Remove by value
function removeFromArr($arr, $val)
{
unset($arr[array_search($val, $arr)]);
return array_values($arr);
}
如果指定了索引:
$arr = ['a', 'b', 'c'];
$index = 0;
unset($arr[$index]); // $arr = ['b', 'c']
如果未指定索引:
$arr = ['a', 'b', 'c'];
$index = array_search('a', $arr); // search the value to find index
if($index !== false){
unset($arr[$index]); // $arr = ['b', 'c']
}
该if
条件是必要的,因为如果index
找不到,unset()
将自动删除数组中我们不需要的第一个元素
解决方案:
unset($array[3]); unset($array['foo']);
unset($array[3], $array[5]); unset($array['foo'], $array['bar']);
array_splice($array, $offset, $length);
进一步说明:
使用这些功能将从PHP中删除对这些元素的所有引用。如果要在数组中保留键,但键值为空,则将空字符串分配给元素:
$array[3] = $array['foo'] = '';
除了语法,使用之间还有逻辑上的区别 unset()和将''分配给元素。第一个说This doesn't exist anymore,
,第二个说This still exists, but its value is the empty string.
如果要处理数字,则分配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()。
我只想说我有一个具有可变属性的特定对象(它基本上是在映射一个表,并且正在更改表中的列,因此反映该表的对象中的属性也会有所不同):
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);
iii)
$Array = array("test1", "test2", "test3", "test3");
array_splice($Array,1,2);
iv)
$Array = array("test1", "test2", "test3", "test3");
array_shift($Array);
<?php
$array = array("your array");
$array = array_diff($array, ["element you want to delete"]);
?>
在变量中创建数组,$array
然后在“您要删除的元素”中添加“ a”。如果要删除多个项目,则:“ a”,“ b”。
使用array_search获取密钥,并在未设置的情况下将其删除(如果找到):
if (($key = array_search('word', $array)) !== false) {
unset($array[$key]);
}
尽管unset()
这里已经提到过多次,但仍然需要提及的是,它unset()
接受多个变量,从而可以轻松地在一个操作中从数组中删除多个不连续的元素:
// Delete multiple, noncontiguous elements from an array
$array = [ 'foo', 'bar', 'baz', 'quz' ];
unset( $array[2], $array[3] );
print_r($array);
// Output: [ 'foo', 'bar' ]
unset()不接受要删除的键数组,因此下面的代码将失败(不过,使动态使用unset()稍微容易些)。
$array = range(0,5);
$remove = [1,2];
$array = unset( $remove ); // FAILS: "unexpected 'unset'"
print_r($array);
相反,可以在foreach循环中动态使用unset():
$array = range(0,5);
$remove = [1,2];
foreach ($remove as $k=>$v) {
unset($array[$v]);
}
print_r($array);
// Output: [ 0, 3, 4, 5 ]
还有另一种做法有待提及。有时,摆脱某些数组键的最简单方法是将$ array1复制到$ array2。
$array1 = range(1,10);
foreach ($array1 as $v) {
// Remove all even integers from the array
if( $v % 2 ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 1, 3, 5, 7, 9 ];
显然,相同的做法适用于文本字符串:
$array1 = [ 'foo', '_bar', 'baz' ];
foreach ($array1 as $v) {
// Remove all strings beginning with underscore
if( strpos($v,'_')===false ) {
$array2[] = $v;
}
}
print_r($array2);
// Output: [ 'foo', 'baz' ]
使用如下unset
功能:
$a = array(
'salam',
'10',
1
);
unset($a[1]);
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
使用该array_search
函数获取元素键,并使用上述方式删除数组元素,如下所示:
$a = array(
'salam',
'10',
1
);
$key = array_search(10, $a);
if ($key !== false) {
unset($a[$key]);
}
print_r($a);
/*
Output:
Array
(
[0] => salam
[2] => 1
)
*/
有两种方法,可以通过保留索引的顺序以及不知道第一项的键名的方式删除数组的第一项。
// 1 is the index of the first object to get
// NULL to get everything until the end
// true to preserve keys
$array = array_slice($array, 1, null, true);
// Rewinds the array's internal pointer to the first element
// and returns the value of the first array element.
$value = reset($array);
// Returns the index element of the current array position
$key = key($array);
unset($array[$key]);
对于此样本数据:
$array = array(10 => "a", 20 => "b", 30 => "c");
您必须具有以下结果:
array(2) {
[20]=>
string(1) "b"
[30]=>
string(1) "c"
}
<?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[$key])
将工作。
对于具有整数键的数组,如果要维护键:
$array = [ 'mango', 'red', 'orange', 'grapes'];
unset($array[2]);
$array = array_values($array);
array_splice($array, 2, 1);
这可能有帮助...
<?php
$a1 = array("a"=>"red", "b"=>"green", "c"=>"blue", "d"=>"yellow");
$a2 = array("a"=>"purple", "b"=>"orange");
array_splice($a1, 0, 2, $a2);
print_r($a1);
?>
结果将是:
Array ( [0] => purple [1] => orange [c] => blue [d] => yellow )
$arrayName = array( '1' => 'somevalue',
'2' => 'somevalue1',
'3' => 'somevalue3',
);
print_r($arrayName[1]);
// somevalue
unset($arrayName[1]);
print_r($arrayName);
unset()
数组的迭代,将不再包含移除的值。OTOH,确实Stevan的答案很充分,实际上,这是我一直在寻找的答案-但不是OP :)