Borrar un elemento de un array en PHP

¿Existe una manera fácil de eliminar un elemento de un array usando PHP, de manera que foreach ($array) ya no incluya ese elemento?

Pensaba que poniéndolo como null lo conseguiría, pero aparentemente no funciona.

Solución

Existen diferentes formas de eliminar un elemento de un array, siendo algunas más útiles para algunas tareas específicas que otras.

Borrar un elemento del array

Si quieres borrar sólo un elemento del array puedes usar unset() o alternativamente array_splice().

Además, si tiene el valor y no conoce la clave para borrar el elemento, puede utilizar \array_search() para obtener la clave.

Método unset()

Tenga en cuenta que cuando utilice \unset() las claves del array no cambiarán/reindexarán. Si quiere reindexar las claves puede usar \array_values() después de \unset() que convertirá todas las claves en claves numéricas enumeradas empezando por 0.

Código

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \unset($array[1]);
                //↑ Key which you want to delete

?>

Salida

[
    [0] => a
    [2] => c
]

\array_splice() método

Si utilizas \array_splice() las claves se reindexarán automáticamente, pero las claves asociativas no cambiarán a diferencia de \array_values() que convertirá todas las claves en claves numéricas.

Además, \array_splice() necesita el desplazamiento, ¡no la clave! como segundo parámetro.

Código

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    \array_splice($array, 1, 1);
                        //↑ Offset which you want to delete

?>

Salida

[
    [0] => a
    [1] => c
]

array_splice() al igual que \unset() toman el array por referencia, y esto significa que no quieres asignar los valores de retorno de esas funciones de nuevo al array.

Borrar múltiples elementos del array

Si quieres borrar múltiples elementos del array y no quieres llamar a unset() o \array_splice() varias veces puedes usar las funciones \array_diff() o \array_diff_key() dependiendo de si conoces los valores o las claves de los elementos que quieres borrar.

Método \array_diff()7

Si conoce los valores de los elementos del array que quiere borrar, entonces puede utilizar \array_diff(). Al igual que antes con unset() no cambiará/reindexará las claves del array.

Código

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff($array, ["a", "c"]);
                               //└────────┘→ Array values which you want to delete

?>

Salida

[
    [1] => b
]

\array_diff_key() método

Si conoce las claves de los elementos que desea eliminar, entonces debe utilizar \array_diff_key(). Aquí tienes que asegurarte de pasar las claves como llaves en el segundo parámetro y no como valores. De lo contrario, tiene que voltear el array con \array_flip(). Y también aquí las claves no cambiarán/reindexarán.

Código

<?php

    $array = [0 => "a", 1 => "b", 2 => "c"];
    $array = \array_diff_key($array, [0 => "xy", "2" => "xy"]);
                                    //↑           ↑ Array keys which you want to delete
?>

Salida

[
    [1] => b
]

Además, si quieres usar unset() o \array_splice() para borrar varios elementos con el mismo valor, puedes usar array_keys() para obtener todas las claves de un valor específico y luego borrar todos los elementos.

Comentarios (9)

Hay que tener en cuenta que unset() mantendrá los índices intactos, que es lo que se espera cuando se utilizan índices de cadena (array como hashtable), pero puede ser bastante sorprendente cuando se trata de arrays indexados con 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)
} */

Así que array_splice() se puede utilizar si desea normalizar sus claves enteras. Otra opción es usar array_values() después de 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)
} */
Comentarios (8)
unset($array[$index]);
Comentarios (0)