Eliminar un elemento de una matriz en PHP

Resuelto Ben asked hace 54 años • 27 respuestas

¿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 nullbastaría con configurarlo, pero aparentemente no funciona.

Ben avatar Jan 01 '70 08:01 Ben
Aceptado

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
]
Rizier123 avatar Dec 15 '2008 20:12 Rizier123

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)
} */
Stefan Gehrig avatar Dec 15 '2008 21:12 Stefan Gehrig