Kiedy znamy klucz wskazujący na element do usunięcia z tablicy, możemy jej zawartość dość prosto usunąć przy pomocy unset:
<?php $array = array(0 => "a", 1 => "b", 2 => "c"); unset($array[1]); //↑ Klucz który wskazujemy do skasowania ?>
Wynikiem będzie tablica:
[0] => a
[2] => c
Można zastosować inny sposób z funkcją array_splice:
<?php $array = array(0 => "a", 1 => "b", 2 => "c"); array_splice($array, 1, 1); //↑ Offset który ma zostać skasowany ?>
Wynikiem działania będzie tablica:
[0] => a
[1] => c
Jak widać różnica w działaniu obu algorytmów prowadzi do zmian wartości kluczy.
Dla tablic wielowymiarowych można wykorzystywać funkcję array_diff()
<?php $array = array(0 => "a", 1 => "b", 2 => "c"); $array = array_diff($array, ["a", "c"]); //└────────┘→ wskazujemy wartości tablicy do skasowania ?>
Podobnie jak z funkcją unset(), indeks tablicy nie zmieni się i wynikiem pozostanie tablica:
[1] => b
Podobną metodą będzie kolejna z zastosowaniem funkcji array_diff_key().
<?php $array = array(0 => "a", 1 => "b", 2 => "c"); $array = array_diff_key($array, [0 => "xy", "2" => "xy"]); //↑ ↑ wskazujemy klucze tablicy do usunięcia ?>
Wynikiem będzie identyczna tablica - tutaj też nie zmienia się indeks:
[1] => b
Analizując funkcję unset() w porównaniu z funkcją array_splice() widzimy, że unset() zachowuje ona wartości kluczy:
$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) } */
Funkcja array_splice() może więc być wykorzystywana dla normalizacji porządku kluczy w tablicy.
Gdy chcemy uzyskać kolejne klucze z wykorzystaniem funkcji unset(), można ten efekt normalizacji kolejności elementów tablicy uzyskać w sposób nastepujący:
$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) } */
Weźmy kolejną tablicę:
$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);
Rezultat usuwania kolorów będzie następujący:
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 )
Jeśli potrzebujemy znormalizować kolejność kluczy w takiej tablicy, można zastosować:
$arr = array_merge(array_diff($arr, array("yellow", "red")));
Wtedy wynikiem pozostanie tablica:
Array ( [0] => blue [1] => green [2] => green [3] => orange [4] => indigo )
Weźmy podobny przykład:
$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);
Wynikiem działania funkcji array_diff_key() będzie:
Array ( [key1] => value 1 [key3] => value 3 [key5] => value 5 )
Do prostych zastosowań usuwania z tablicy elementu względem jego wartości, może być prosta funkcja:
// Remove by value function removeFromArr($arr, $val) { unset($arr[array_search($val, $arr)]); return array_values($arr); }
Załóżmy, że mamy tablicę:
Array ( [user_id] => 193 [storage] => 5 )
By usunąć z niej pozycję storage robimy tak:
unset($attributes['storage']); $attributes = array_filter($attributes);
Wynikiem pozostanie już tylko tablica:
Array ( [user_id] => 193 )
Gdy wiadomo co usunąć:
// Delete multiple, noncontiguous elements from an array $array = [ 'foo', 'bar', 'baz', 'quz' ]; unset( $array[2], $array[3] ); print_r($array); // Output: [ 'foo', 'bar' ]
By usunąć np. dwa elementy tablicy z tablicy składającej się np. z 0,1,2,3,4,5, można zastosować funkcję foreach:
$array = range(0,5); $remove = [1,2]; foreach ($remove as $k=>$v) { unset($array[$v]); } print_r($array); // Output: [ 0, 3, 4, 5 ]
Powiedzmy, że mamy tablicę 0,1,2,3,4,5,6,7,8,9,10 z której chcemy usunąć elementy parzyste:
$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 ];
Gdyby nasza tablica była z elementami string, a z niej usuwamy łańcuch z podkreślnikiem:
$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' ]