PHP: Delete an element from an array
有没有一种简单的方法可以使用php从数组中删除元素,这样
我原以为把它设置到
删除数组元素有不同的方法,其中一些方法对某些特定任务比其他方法更有用。
删除一个数组元素如果只想删除一个数组元素,可以使用
另外,如果您有值并且不知道删除元素的键,那么可以使用
注意,当使用
代码
1 2 3 4 5 6 7 |
产量
1 2 3 4 | [ [0] => a [2] => c ] |
如果使用
另外,
代码
1 2 3 4 5 6 7 | <?php $array = [0 =>"a", 1 =>"b", 2 =>"c"]; \array_splice($array, 1, 1); //↑ Offset which you want to delete ?> |
产量
1 2 3 4 | [ [0] => a [1] => c ] |
如果要删除多个数组元素并且不想多次调用
如果您知道要删除的数组元素的值,那么可以使用
代码
1 2 3 4 5 6 7 | <?php $array = [0 =>"a", 1 =>"b", 2 =>"c"]; $array = \array_diff($array, ["a","c"]); //└────────┘→ Array values which you want to delete ?> |
产量
1 2 3 | [ [1] => b ] |
如果您知道要删除的元素的键,那么您需要使用
代码
1 2 3 4 5 6 | <?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 2 3 | [ [1] => b ] |
如果要使用
需要注意的是,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
因此,如果您想规范化整数键,可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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) } */ |
1 2 3 4 5 6 7 | // 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); |
这是上面代码的输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
现在,array_values()将很好地重新索引一个数字数组,但它将从数组中删除所有键字符串,并用数字替换它们。如果需要保留键名(字符串),或者如果所有键都是数字的,则重新索引数组,请使用array_merge():
1 2 |
输出
1 2 3 4 5 6 7 8 |
1 2 3 4 |
1 |
如果您有一个数字索引数组,其中所有值都是唯一的(或者它们不是唯一的,但您希望删除某个特定值的所有实例),则只需使用array_diff()删除匹配的元素,如下所示:
1 |
例如:
1 2 3 4 5 | $my_array = array('Andy', 'Bertha', 'Charles', 'Diana'); echo sizeof($my_array) ." "; $my_array = array_diff($my_array, array('Charles')); echo sizeof($my_array); |
显示以下内容:
1 2 | 4 3 |
在本例中,值为"charles"的元素将被移除,可以通过size of()调用进行验证,该调用报告初始数组的大小为4,移除后为3。
另外,对于命名元素:
1 |
销毁数组的单个元素
1 2 3 |
输出将是:
1 2 3 4 5 6 7 8 9 10 |
如果需要重新索引数组:
1 2 |
然后输出为:
1 2 3 4 5 6 7 8 9 10 |
将元素从数组末尾弹出-返回已删除元素的值
1 2 3 4 |
输出将是
1 2 3 4 5 6 7 |
从数组中移除第一个元素(红色),-返回移除元素的值
1 2 3 4 | $color = array("a" =>"red","b" =>"green" ,"c" =>"blue"); $first_color = array_shift($color); print_r ($color); print_r ('First Color: '.$first_color); |
输出将是:
1 2 3 4 5 6 |
1 2 3 4 5 6 7 | <?php $stack = array("fruit1","fruit2","fruit3","fruit4"); $fruit = array_shift($stack); print_r($stack); echo $fruit; ?> |
输出:
1 2 3 4 5 6 7 8 |
为了避免进行搜索,可以与
1 2 |
在这种情况下,不必搜索/使用密钥。
函数内部的
如果一个全局变量在函数内部是
1 2 3 4 5 6 7 8 9 10 11 | <?php function destroy_foo() { global $foo; unset($foo); } $foo = 'bar'; destroy_foo(); echo $foo; ?> |
以上代码的答案将是bar。
对于
1 2 3 4 5 6 7 8 9 |
如果您必须删除一个数组中的多个值,而该数组中的条目是对象或结构化数据,那么最好选择
1 2 3 4 5 6 7 8 9 | $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']] |
关联数组
对于关联数组,使用
1 2 3 4 |
数字数组
对于数字数组,使用
1 2 3 4 |
注释
对数字数组使用
如果需要从关联数组中删除多个元素,可以使用array diff_key()(此处与array_flip()一起使用):
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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); |
输出:
1 |
1 2 3 4 5 6 | // Remove by value function removeFromArr($arr, $val) { unset($arr[array_search($val, $arr)]); return array_values($arr); } |
我只想说我有一个特殊的对象,它有可变的属性(它基本上是映射一个表,我正在更改表中的列,所以对象中反映表的属性也会有所不同):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 {} } } } |
假设您有以下数组:
1 2 3 4 5 |
要删除
1 2 |
你得到:
1 2 3 4 |
遵循默认功能:
i)
二)
iii)
1 2 3 |
四)
1 2 3 |
解决:
1
进一步解释:
使用这些函数可以从PHP中删除对这些元素的所有引用。如果要在数组中保留键,但值为空,请将空字符串赋给元素:
1 | $array[3] = $array['foo'] = ''; |
除了语法之外,使用unset()和将""分配给元素之间还有逻辑上的区别。第一个说
如果您处理的是数字,指定0可能是更好的选择。因此,如果一家公司停止生产XL1000型链轮,它将更新其库存:
1 |
但是,如果它暂时用完了XL1000链轮,但计划在本周晚些时候从工厂接收新的装运,这会更好:
1 | $products['XL1000'] = 0; |
如果取消设置()元素,PHP将调整数组,以便循环仍能正常工作。它不会压缩数组来填充缺失的孔。这就是我们所说的所有数组都是关联的,即使它们看起来是数字。下面是一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 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():
1 |
或者,array_splice()自动重新索引数组以避免留下孔:
1 2 3 4 5 6 7 8 9 10 11 | // 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()数组中的多个分段元素
虽然这里多次提到
1 2 3 4 5 |
动态取消设置()。
unset()不接受要删除的键数组,因此下面的代码将失败(不过,动态使用unset()会稍微容易一些)。
1 2 3 4 |
相反,unset()可以在foreach循环中动态使用:
1 2 3 4 5 6 7 |
通过复制数组移除数组键
还有另一种做法尚未提及。有时,消除某些数组键的最简单方法是简单地将$array1复制到$array2。
1 2 3 4 5 6 7 8 9 |
显然,同样的做法也适用于文本字符串:
1 2 3 4 5 6 7 8 9 |
1 2 3 4 |
在变量
基于键移除数组元素:
使用下面的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
基于值移除数组元素:
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?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); ?> |
产量
1 2 3 4 5 6 | 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 ) |
使用以下代码:
1 2 3 |
两种删除数组第一个项的方法,保持索引的顺序,如果不知道第一个项的键名,也可以删除。
解11 2 3 4 | // 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); |
解2
1 2 3 4 5 6 |
对于此示例数据:
1 |
您必须获得以下结果:
1 2 3 4 5 6 |
对于关联数组,使用非整数键:
简单地说,
对于具有整数键的数组,如果要维护键:
1 2 |
这可能有帮助…
1 2 3 4 5 6 | <?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); ?> |
结果将是:
1 |
使用array_search获取密钥,如果找到,则使用unset将其移除:
1 2 3 |
1 2 3 4 5 6 | $x = array(1, 2, 3, 4, 5); var_dump($x); unset($x[3]); // Here is the key to be deleted echo ''; array_values($x); var_dump($x); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | $arrayName = array('1' => 'somevalue', '2' => 'somevalue1', '3' => 'somevalue3', 500 => 'somevalue500', ); echo $arrayName['500']; //somevalue500 array_splice($arrayName, 1, 2); print_r($arrayName); //Array ( [0] => somevalue [1] => somevalue500 ) $arrayName = array( '1' => 'somevalue', '2' => 'somevalue1', '3' => 'somevalue3', 500 => 'somevalue500', ); echo $arrayName['500']; //somevalue500 unset($arrayName[1]); print_r($arrayName); //Array ( [0] => somevalue [1] => somevalue500 ) |
您只需使用
记住,数组必须在
执行此任务有两种方法:unset()和array_splice()。
我们假设两个数组:
1 2 3 |
带unStand()
1 2 3 4 |
- 删除数组元素后,数组索引不会更改
带数组拼接(
1 2 3 4 | syntax - array_splice(array, index, length) array_splice($array_1, 1, 1); // Remove one element from $array_1 from index 1 array_splice($array_2, 3, 1); // Remove one element from $array_2 from index 3 |
- 从数组中删除元素后,所有数组元素都将重新建立索引。
我们可以通过引用修改变量内容,使用
1 2 3 4 5 | <?php // Remove all elements in the array foreach ($array as &$arr) { $arr = null; } |
对于那些在PHP中寻找Ruby的
1 2 3 4 5 6 7 8 9 10 |
这不仅将从数组中删除元素,而且还将返回存储在该键中的值,以便以非线性方式使用数组。
可以使用array_pop方法删除数组的最后一个元素:
1 2 3 4 5 6 7 |