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 )
根据键删除一个数组元素:
使用如下的未unset
function:
$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
函数后取消设置。