Eliminar un elemento de una matriz en PHP
¿Existe una manera fácil de eliminar un elemento de una matriz usando PHP, de modo que foreach ($array)
ya no incluya ese elemento?
Pensé que null
bastaría con configurarlo, pero aparentemente no funciona.
Hay diferentes formas de eliminar un elemento de matriz, algunas son más útiles para algunas tareas específicas que otras.
Eliminar un único elemento de matriz
Si desea eliminar solo un elemento de la matriz, puede usar unset()
y alternativamente array_splice()
.
¿Por clave o por valor?
Si conoce el valor y no conoce la clave para eliminar el elemento, puede usarlo array_search()
para obtener la clave. Esto sólo funciona si el elemento no aparece más de una vez, ya que array_search()
sólo devuelve el primer resultado.
unset()
Expresión
Nota: Cuando utilices unset()
las claves de matriz no cambiarán. Si desea volver a indexar las claves, puede usar array_values()
after unset()
, lo que convertirá todas las claves en claves enumeradas numéricamente a partir de 0 (la matriz sigue siendo una lista ).
Código de ejemplo:
$array = [0 => "a", 1 => "b", 2 => "c"];
unset($array[1]);
// ↑ Key of element to delete
Salida de ejemplo:
[
[0] => a
[2] => c
]
array_splice()
Función
Si usa array_splice()
las claves (enteras), se reindexará automáticamente, pero las claves asociativas (cadenas) no cambiarán, a diferencia de array_values()
after unset()
, que convertirá todas las claves en claves numéricas.
Nota: array_splice()
necesita el desplazamiento , no la clave , como segundo parámetro; clave de matriz de desplazamiento .= array_flip(array_keys(
))[
]
Código de ejemplo:
$array = [0 => "a", 1 => "b", 2 => "c"];
array_splice($array, 1, 1);
// ↑ Offset of element to delete
Salida de ejemplo:
[
[0] => a
[1] => c
]
array_splice()
, al igual que unset()
, toma la matriz como referencia. No asigna los valores de retorno a la matriz.
Eliminar varios elementos de la matriz
Si desea eliminar varios elementos de la matriz y no desea llamarlos unset()
varias array_splice()
veces, puede usar las funciones array_diff()
o
array_diff_key()
dependiendo de si conoce los valores o las claves de los elementos a eliminar de la matriz.
array_diff()
Función
Si conoce los valores de los elementos de la matriz que desea eliminar, puede utilizar array_diff()
. Como antes, unset()
no cambiará las claves de la matriz.
Código de ejemplo:
$array = [0 => "a", 1 => "b", 2 => "c", 3 => "c"];
$array = array_diff($array, ["a", "c"]);
// └────────┘
// Array values to delete
Salida de ejemplo:
[
[1] => b
]
array_diff_key()
Función
Si conoce las claves de los elementos que desea eliminar, entonces desea utilizar array_diff_key()
. Debe asegurarse de pasar las claves como claves en el segundo parámetro y no como valores. Las claves no se reindexan.
Código de ejemplo:
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = array_diff_key($array, [0 => "xy", "2" => "xy"]);
// ↑ ↑
// Array keys of elements to delete
Salida de ejemplo:
[
[1] => b
]
Si desea utilizar unset()
o array_splice()
eliminar varios elementos con el mismo valor, puede utilizar
array_keys()
para obtener todas las claves para un valor específico y luego eliminar todos los elementos.
array_filter()
Función
Si desea eliminar todos los elementos con un valor específico en la matriz, puede usar array_filter()
.
Código de ejemplo:
$array = [0 => "a", 1 => "b", 2 => "c"];
$array = array_filter($array, static function ($element) {
return $element !== "b";
// ↑
// Array value which you want to delete
});
Salida de ejemplo:
[
[0] => a
[2] => c
]
Cabe señalar que unset()
mantendrá los índices intactos, que es lo que se esperaría al usar índices de cadena (matriz como tabla hash), pero puede ser bastante sorprendente cuando se trata de matrices indexadas con números enteros:
$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()
puede usarse si desea normalizar sus claves enteras. Otra opción es usar array_values()
después 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)
} */