PHP:从数组中删除一个元素

有一种简单的方法来从PHP数组中删除元素,例如foreach ($array)不再包含该元素?

我认为把它设置为null将做到这一点,但显然不是。

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

删除一个数组元素

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

另外,如果你有这个值,并不知道删除元素的关键,你可以使用array_search()来获得密钥。

unset()方法

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

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

产量

 Array ( [0] => a [2] => c ) 

array_splice()方法

如果使用array_splice() ,键将被自动重新编制索引,但关联键不会相对于将所有键转换为数字键的array_values()

另外array_splice()需要偏移量,而不是键!作为第二个参数。

 <?php $array = array(0 => "a", 1 => "b", 2 => "c"); array_splice($array, 1, 1); //↑ Offset which you want to delete ?> 

产量

 Array ( [0] => a [1] => c ) 

unset() array_splice()相同的array_splice()通过引用获取数组,这意味着您不想将这些函数的返回值分配回数组。

删除多个数组元素

如果你想删除多个数组元素,而不想多次调用unset()array_splice() ,你可以使用函数array_diff()array_diff_key()这取决于你是否知道元素的值或者键你想删除。

array_diff()方法

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

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

产量

 Array ( [1] => b ) 

array_diff_key()方法

如果您知道要删除的元素的键,那么您想使用array_diff_key() 。 在这里,你必须确保你把键作为第二个参数的键而不是值。 否则,你必须用array_flip()来翻转数组。 而且这里的钥匙不会改变/ reindex。

 <?php $array = array(0 => "a", 1 => "b", 2 => "c"); $array = array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑ Array keys which you want to delete ?> 

产量

 Array ( [1] => b ) 

此外,如果您想使用unset()array_splice()删除具有相同值的多个元素,则可以使用array_keys()获取特定值的所有键,然后删除所有元素。

需要注意的是, unset()会保持索引不变,这就是你使用string索引(数组作为散列表)所期望的,但是当处理整数索引数组时,这可能是相当令人惊讶的:

 $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()可以被使用。 另一个select是在unset()之后使用array_values() 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) } */ 
  // 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()将很好地重新索引一个数值数组,但会从数组中删除所有的键string,并用数字replace它们。 如果您需要保留键名(string),或者如果所有键都是数字,则重新索引数组,请使用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()调用进行validation,sizeof()初始数组的大小是4,移除后是3。

 unset($array[$index]); 

另外,对于一个命名元素:

unset($array["elementName"]);

 <?php $stack = array("fruit1", "fruit2", "fruit3", "fruit4"); $fruit = array_shift($stack); print_r($stack); echo $fruit; ?> 

输出:

 Array ( [0] => fruit2 [1] => fruit3 [2] => fruit4 ) fruit1 

销毁数组中的单个元素

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

从数组的末尾popup元素 – 返回已移除元素的值

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 

为了避免search,可以使用array_diff

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

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

unset()销毁指定的variables。

函数内的unset()的行为可能会因您尝试销毁的variablestypes而异。

如果一个函数内的全局variablesunset() ,只有局部variables被销毁。 调用环境中的variables将保持与调用unset()之前相同的值。

 <?php function destroy_foo() { global $foo; unset($foo); } $foo = 'bar'; destroy_foo(); echo $foo; ?> 

上面代码的答案会是

在函数中unset()全局variables

 <?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) 

注意

对数值数组使用unset不会产生错误,但是会混淆索引:

 $arr = array(1, 2, 3); unset($arr[1]); // RESULT : array(0 => 1, 2 => 3) 

如果您必须删除数组中的多个值,并且该数组中的条目是对象或结构化数据,则[array_filter][1]是最佳select。 那些从callback函数返回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']] 

如果你需要从关联数组中删除多个元素,你可以使用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 */ public function removeFromArr($arr, $val) { unset($arr[array_search($val, $arr)]); return array_values($arr); } 

遵循默认function

 i) $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); 

假设你有这样一个数组:

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

要删除storage ,请执行:

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

你会得到:

 Array ( [user_id] => 193 ) 
 $arr = array('orange', 'banana', 'apple', 'raspberry'); $result= array_pop($arr); print_r($result); 

我只想说,我有一个特定的对象,它具有可变属性(这基本上是映射表,我改变了表中的列,所以对象中的属性,反映表也会有所不同

 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数组内容以反映新的属性。

花了我一点时间来解决这个问题。 希望这可以帮助别人。

 <?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 ) 

根据键删除一个数组元素:

使用如下的未unsetfunction:

 $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 ) */ 

这可能有帮助…

 <?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 ) 

对于那些正在寻找ruby的hash#delete相当于php:

 <?php function array_delete(&$array, $key) { if (!isset($array[$key])) { return null; } $value = $array[$key]; unset($array[$key]); return $value; } 

因为这是我第一次来到这里

当从PHP中的数组中删除一个元素时,一个好的函数是unset函数。 这是一个用法的例子:

 $anArray = array("X", "Y", "Z"); unset($anArray[0]); //'dumps' the content of $anArray to the page: var_dump($anArray); 

var_dump函数的输出是:

 array(2) { [1]=> string(1) "Y" [2]=> string(1) "Z" } 

你可以简单地使用unset()来删除一个数组。

请记住,数组必须在foreach函数后取消设置。