Notatki PHP

prywatne zapiski na kamieniu

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' ]