Is there an easy way to delete an element from an array using PHP
, such that foreach ($array)
no longer includes that element?
I thought that setting it to null
would do it, but apparently it does not work.
转载于:https://stackoverflow.com/questions/369602/php-delete-an-element-from-an-array
There are different ways to delete an array element, where some are more useful for some specific tasks than others.
If you want to delete just one array element you can use unset()
or alternative array_splice()
.
Also if you have the value and don't know the key to delete the element you can use array_search()
to get the key.
unset()
methodNote that when you use unset()
the array keys won't change/reindex. If you want to reindex the keys you can use array_values()
after unset()
which will convert all keys to numerical enumerated keys starting from 0.
Code
<?php
$array = array(0 => "a", 1 => "b", 2 => "c");
unset($array[1]);
//↑ Key which you want to delete
?>
Output
Array (
[0] => a
[2] => c
)
array_splice()
methodIf you use array_splice()
the keys will be automatically reindexed, but the associative keys won't change as opposed to array_values()
which will convert all keys to numerical keys.
Also array_splice()
needs the offset, not the key! as the second parameter.
Code
<?php
$array = array(0 => "a", 1 => "b", 2 => "c");
array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
Output
Array (
[0] => a
[1] => c
)
array_splice()
same as unset()
take the array by reference, this means you don't want to assign the return values of those functions back to the array.
If you want to delete multiple array elements and don't want to call unset()
or array_splice()
multiple times you can use the functions array_diff()
or array_diff_key()
depending on if you know the values or the keys of the elements which you want to delete.
array_diff()
methodIf you know the values of the array elements which you want to delete, then you can use array_diff()
. As before with unset()
it won't change/reindex the keys of the array.
Code
<?php
$array = array(0 => "a", 1 => "b", 2 => "c");
$array = array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
Output
Array (
[1] => b
)
array_diff_key()
methodIf you know the keys of the elements which you want to delete, then you want to use array_diff_key()
. Here you have to make sure you pass the keys as keys in the second parameter and not as values. Otherwise, you have to flip the array with array_flip()
. And also here the keys won't change/reindex.
Code
<?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
?>
Output
Array (
[1] => b
)
Also if you want to use unset()
or array_splice()
to delete multiple elements with the same value you can use array_keys()
to get all the keys for a specific value and then delete all elements.
unset($array[$index]);
It should be noted that unset()
will keep indexes untouched, which is what you'd expect when using string indexes (array as hashtable), but can be quite surprising when dealing with integer indexed arrays:
$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)
} */
So array_splice()
can be used if you'd like to normalize your integer keys. Another option is using 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)
} */
Also, for a named element:
unset($array["elementName"]);
// 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);
This is the output from the code above:
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
)
Now, array_values() will reindex a numerical array nicely, but will remove all key strings from the array and replace them with numbers. If you need to preserve the key names (strings), or reindex the array if all keys are numerical, use array_merge():
$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);
outputs
Array
(
[0] => blue
[1] => green
[2] => green
[3] => orange
[4] => indigo
)
$key = array_search($needle,$array);
if($key!==false){
unset($array[$key]);
}
If you have a numerically indexed array where all values are unique (or they are non-unique but you wish to remove all instances of a particular value), you can simply use array_diff() to remove a matching element, like this:
$my_array = array_diff($my_array, array('Value_to_remove'));
For example:
$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);
This displays the following:
4
3
In this example, the element with the value 'Charles' is removed as can be verified by the sizeof() calls that report a size of 4 for the initial array, and 3 after the removal.
$arr = array('orange', 'banana', 'apple', 'raspberry');
$result= array_pop($arr);
print_r($result);
<?php
$stack = array("fruit1", "fruit2", "fruit3", "fruit4");
$fruit = array_shift($stack);
print_r($stack);
echo $fruit;
?>
Output:
Array
(
[0] => fruit2
[1] => fruit3
[2] => fruit4
)
fruit1
unset()
destroys the specified variables.
The behavior of unset()
inside of a function can vary depending on what type of variable you are attempting to destroy.
If a globalized variable is unset()
inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset()
was called.
<?php
function destroy_foo()
{
global $foo;
unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
The Answer of the above code will be bar
To unset()
a global variable inside of a function
<?php
function foo()
{
unset($GLOBALS['bar']);
}
$bar = "something";
foo();
?>
I'd just like to say I had a particular Object, that had variable attributes (it was basically mapping a table and I was changing the columns in the table, so the attributes in the object, reflecting the table would vary as well
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 {}
}
}
}
The whole purpose of $fields was just so I don't have to look everywhere in the code when they're changed, I just look at the beginning of the class and change the list of attributes and the $fields array content to reflect the new attributes.
Took me a little while to figure this out. Hope this can help someone.
Suppose you have such an array:
Array
(
[user_id] => 193
[storage] => 5
)
To delete storage
, do:
unset($attributes['storage']);
$attributes = array_filter($attributes);
And you get:
Array
(
[user_id] => 193
)
Destroy a single element of an array
unset()
$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);
The output will be:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[3]=>
string(1) "D"
[4]=>
string(1) "E"
}
If you need to re index the array:
$array1 = array_values($array1);
var_dump($array1);
Then the output will be:
array(4) {
[0]=>
string(1) "A"
[1]=>
string(1) "B"
[2]=>
string(1) "D"
[3]=>
string(1) "E"
}
Pop the element off the end of array - return the value of the removed element
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
The output will be
Array
(
[0] => orange
[1] => banana
[2] => apple
)
Last Fruit: raspberry
Remove the first element (red) from an array, - return the value of the removed element
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);
The output will be:
Array
(
[b] => green
[c] => blue
)
First Color: red
Follow default functions
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);
If you have to delete multiple values in an array and the entries in that array are objects or structured data, [array_filter][1]
is your best bet. Those entries that return a true from the callback function will be retained.
$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']]
For associative arrays, use unset
:
$arr = array('a' => 1, 'b' => 2, 'c' => 3);
unset($arr['b']);
// RESULT : array('a' => 1, 'c' => 3)
For numeric arrays, use array_splice
:
$arr = array(1, 2, 3);
array_splice($arr, 1, 1);
// RESULT : array(0 => 1, 1 => 3)
Using unset
for numeric arrays will not produce an error, but it will mess up your indexes :
$arr = array(1, 2, 3);
unset($arr[1]);
// RESULT : array(0 => 1, 2 => 3)
// Remove by value
function removeFromArr($arr, $val)
{
unset($arr[array_search($val, $arr)]);
return array_values($arr);
}
If you need to remove multiple elements from an associative array, you can use array_diff_key() (here used with 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);
Output:
Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 )
To avoid doing a search one can play around with array_diff
:
$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11
In this case one doesn't have to search/use the key.