Existuje jednoduchý spôsob, ako odstrániť prvok z poľa pomocou PHP tak, aby foreach ($array)
už neobsahoval tento prvok?
Myslel som si, že to urobí nastavenie hodnoty null
, ale zrejme to nefunguje.
Existujú rôzne spôsoby vymazania prvku poľa, pričom niektoré z nich sú pre niektoré špecifické úlohy užitočnejšie ako iné.
Ak chcete odstrániť len jeden prvok poľa, môžete použiť \unset()
alebo alternatívne \array_splice()
.
Ak máte hodnotu a nepoznáte kľúč na vymazanie prvku, môžete použiť \array_search()
na získanie kľúča.
\unset()
metódaVšimnite si, že pri použití funkcie \unset()
sa kľúče poľa nezmenia/neindexujú. Ak chcete kľúče reindexovať, môžete po funkcii \unset()
použiť \array_values()
, ktorá prevedie všetky kľúče na číselné vymenované kľúče počnúc od 0.
Kód
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\unset($array[1]);
//↑ Key which you want to delete
?>
Výstup
[
[0] => a
[2] => c
]
\array_splice()
metódaAk použijete metódu \array_splice()
, kľúče sa automaticky reindexujú, ale asociatívne kľúče sa nezmenia, na rozdiel od metódy \array_values()
, ktorá prevedie všetky kľúče na číselné kľúče.
Aj \array_splice()
potrebuje ako druhý parameter offset, nie kľúč!
Kód
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
\array_splice($array, 1, 1);
//↑ Offset which you want to delete
?>
Výstup
[
[0] => a
[1] => c
]
array_splice()
rovnako ako \unset()
berú pole odkazom, a to znamená, že nechcete priradiť návratové hodnoty týchto funkcií späť do poľa.
Ak chcete odstrániť viac prvkov poľa a nechcete viackrát volať funkcie \unset()
alebo \array_splice()
, môžete použiť funkcie \array_diff()
alebo \array_diff_key()
podľa toho, či poznáte hodnoty alebo kľúče prvkov, ktoré chcete odstrániť.
\array_diff()
metódaAk poznáte hodnoty prvkov poľa, ktoré chcete odstrániť, môžete použiť funkciu \array_diff()
. Rovnako ako predtým pri \unset()
sa nezmenia/neindexujú kľúče poľa.
Kód
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff($array, ["a", "c"]);
//└────────┘→ Array values which you want to delete
?>
Výstup
[
[1] => b
]
\array_diff_key()
metódaAk poznáte kľúče prvkov, ktoré chcete vymazať, potom použite \array_diff_key()
. Tu sa musíte uistiť, že v druhom parametri odovzdávate kľúče ako kľúče a nie ako hodnoty. V opačnom prípade musíte pole otočiť pomocou \array_flip()
. A tiež sa tu kľúče nebudú meniť/redexovať.
Kód
<?php
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
//↑ ↑ Array keys which you want to delete
?>
Výstup
[
[1] => b
]
Ak chcete použiť \unset()
alebo \array_splice()
na vymazanie viacerých prvkov s rovnakou hodnotou, môžete použiť \array_keys()
na získanie všetkých kľúčov pre určitú hodnotu a potom vymazať všetky prvky.
Je potrebné poznamenať, že unset()
zachová indexy nedotknuté, čo je to, čo by ste očakávali pri použití reťazcových indexov (pole ako hashtable), ale môže to byť dosť prekvapujúce pri práci s celočíselnými indexovanými poľami:
$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)
} */
Takže array_splice()
môžete použiť, ak chcete normalizovať vaše celočíselné kľúče. Ďalšou možnosťou je použitie array_values()
po 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)
} */