Pregunta PHP: elimina un elemento de una matriz


¿Hay una manera fácil de eliminar un elemento de una matriz usando PHP, tal que foreach ($array) ya no incluye ese elemento?

Pensé que configurarlo para null lo haría, pero aparentemente no funciona.


1968
2017-12-15 20:28


origen


Respuestas:


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

Eliminar un elemento de matriz

Si desea eliminar solo un elemento de la matriz, puede usar unset() o alternativa array_splice().

Además, si tiene el valor y no conoce la clave para eliminar el elemento, puede usar array_search() para obtener la llave

unset() método

Tenga en cuenta que cuando usa unset() las teclas de matriz no cambiarán / reindexarán. Si desea reindexar las claves, puede usar array_values() después unset() que convertirá todas las claves en claves enumeradas numéricas comenzando desde 0.

Código

<?php

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

?>

Salida

Array (
    [0] => a
    [2] => c
)

array_splice() método

Si utiliza array_splice() las claves se reindexarán automáticamente, pero las claves asociativas no cambiarán en comparación con array_values() que convertirá todas las claves en teclas numéricas.

también array_splice() necesita la compensación, no la clave! como el segundo parámetro.

Código

<?php

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

?>

Salida

Array (
    [0] => a
    [1] => c
)

array_splice() igual que unset() tomar la matriz por referencia, esto significa que no desea asignar los valores de retorno de esas funciones a la matriz.

Eliminar múltiples elementos de matriz

Si desea eliminar varios elementos de la matriz y no desea llamar unset() o array_splice() muchas veces puedes usar las funciones array_diff() o array_diff_key() dependiendo de si conoce los valores o las claves de los elementos que desea eliminar.

array_diff() método

Si conoce los valores de los elementos de la matriz que desea eliminar, puede usar array_diff(). Como antes con unset() no cambiará / reindexará las claves de la matriz.

Código

<?php

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

?>

Salida

Array (
    [1] => b
)

array_diff_key() método

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

Código

<?php

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

Salida

Array (
    [1] => b
)

También si quieres usar unset() o array_splice() para eliminar múltiples elementos con el mismo valor que puede usar array_keys() obtener todas las claves para un valor específico y luego eliminar todos los elementos.


2225
2017-12-15 21:25



se debe notar que unset() mantendrá los índices intactos, que es lo que esperaría al usar índices de cadena (matriz como hashtable), pero puede ser bastante sorprendente cuando se trata de arreglos indexados 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)
} */

Asi que 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)
} */

1299
2017-08-02 15:57



  // our initial array  
   $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);  

Este es el resultado del código anterior:

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
)

Ahora, array_values ​​() reindexará muy bien una matriz numérica, pero eliminará todas las cadenas clave de la matriz y las reemplazará con números. Si necesita conservar los nombres de las teclas (cadenas) o reindexar la matriz si todas las claves son numéricas, utilice array_merge ():

$arr = array_merge(array_diff($arr, array("yellow", "red")));
print_r($arr);

salidas

Array
(
    [0] => blue
    [1] => green
    [2] => green
    [3] => orange
    [4] => indigo
)

320
2017-11-15 11:29



$key = array_search($needle,$array);
if($key!==false){
    unset($array[$key]);
}

175
2017-12-15 20:31



unset($array[$index]);

58
2017-11-26 08:25



Si tiene una matriz indexada numéricamente donde todos los valores son únicos (o no son únicos pero desea eliminar todas las instancias de un valor particular), simplemente puede usar array_diff () para eliminar un elemento coincidente, como este:

$my_array = array_diff($my_array, array('Value_to_remove'));

Por ejemplo:

$my_array = array('Andy', 'Bertha', 'Charles', 'Diana');
echo sizeof($my_array) . "\n";
$my_array = array_diff($my_array, array('Charles'));
echo sizeof($my_array);

Esto muestra lo siguiente:

4
3

En este ejemplo, el elemento con el valor 'Charles' se elimina, como puede verificarse mediante las llamadas sizeof () que informan un tamaño de 4 para la matriz inicial y 3 después de la eliminación.


55
2017-07-31 01:06



Además, para un elemento nombrado:

unset($array["elementName"]);


48
2017-07-19 15:37



Destruye un solo elemento de una matriz

unset()

$array1 = array('A', 'B', 'C', 'D', 'E');
unset($array1[2]); // Delete known index(2) value from array
var_dump($array1);

El resultado será:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [3]=>
  string(1) "D"
  [4]=>
  string(1) "E"
}

Si necesita volver a indexar la matriz:

$array1 = array_values($array1);
var_dump($array1);

Entonces la salida será:

array(4) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "D"
  [3]=>
  string(1) "E"
}

Pop el elemento del final de la matriz - devuelve el valor del elemento eliminado

mixed array_pop(array &$array)

$stack = array("orange", "banana", "apple", "raspberry");
$last_fruit = array_pop($stack);
print_r($stack);
print_r('Last Fruit:'.$last_fruit); // Last element of the array

La salida será

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)
Last Fruit: raspberry

Retire el primer elemento (rojo) de una matriz, - devuelve el valor del elemento eliminado

mixed array_shift ( array &$array )

$color = array("a" => "red", "b" => "green" , "c" => "blue");
$first_color = array_shift($color);
print_r ($color);
print_r ('First Color: '.$first_color);

El resultado será:

Array
(
    [b] => green
    [c] => blue
)
First Color: red

26
2018-06-11 05:51



<?php
    $stack = array("fruit1", "fruit2", "fruit3", "fruit4");
    $fruit = array_shift($stack);
    print_r($stack);

    echo $fruit;
?>

Salida:

Array
(
    [0] => fruit2
    [1] => fruit3
    [2] => fruit4
)

fruit1

22
2017-09-22 04:01



Para evitar hacer una búsqueda uno puede jugar con array_diff:

$array = array(3, 9, 11, 20);
$array = array_diff($array, array(11) ); // removes 11

En este caso, no es necesario buscar / usar la tecla.


20
2017-07-26 20:11