Mejor forma de desarmar varios elementos de la matriz


82

El trato aquí es que tengo una matriz con 17 elementos. Quiero obtener los elementos que necesito durante un tiempo determinado y eliminarlos permanentemente de la matriz.

Aquí está el código:

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

Sí, el código es feo, no es necesario golpear. ¿Cómo hago para que esto se vea mejor?

Respuestas:


105

Utilice array_diff_key para eliminar

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

Podría usar array_intersect_key si quisiera proporcionar una matriz de claves para conservar.


6
¡No entiendo por qué este método no se acepta como la respuesta ganadora, ya que en realidad funciona como un encanto!
— Alex

¡Brillante! Buena esa. Me gusta esto en lugar de recorrer la matriz y desarmar elementos.
— Lifo

1
Solución inteligente !!
— MAZux

inteligente pero lento para matrices de entrada grandes. foreach unset parece mucho más rápido con grandes matrices de entrada y (al menos) un número relativamente pequeño de claves para desarmar.
— slepic

101

Parece que la función extract()sería una mejor herramienta para lo que está intentando hacer (asumiendo que extrae todas las claves / valores de una matriz y los asigna a variables con los mismos nombres que las claves en el ámbito local). Una vez que haya extraído el contenido, puede desarmarlo por completo $post, asumiendo que no contiene nada más que desee.

Sin embargo, para responder realmente a su pregunta, puede crear una matriz de las claves que desea eliminar y recorrer, desactivándolas explícitamente ...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... o podría apuntar la variable a una nueva matriz que tiene las claves eliminadas ...

$arr = array_diff_key($arr, array_flip($removeKeys));

... o pasar todos los miembros de la matriz a unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () es una buena solución. Pensé que agregaría que puede usar array_intersect_key () para hacer lo contrario, mantenga solo ciertos elementos
— batfastad

1
Estoy con bbradley - array_diff_key es una gran solución
— Michael

Por casualidad, estaba haciendo esto con el foreach desarmado. Entonces pensé que podría haber una mejor solución. Google me lleva aquí. Así que probé array_diff_key y resulta que es mucho más lento que foreach para matrices de entrada grandes (al menos cuando la cantidad de claves para desarmar es relativamente pequeña).
— slepic

46

Hay otra forma que es mejor que los ejemplos anteriores. Fuente: http://php.net/manual/en/function.unset.php

En lugar de recorrer toda la matriz y desarmar todas sus claves, puede desarmarlo una vez así:

Matriz de ejemplo:

$array = array("key1", "key2", "key3");

Para toda la matriz:

unset($array);

Para claves únicas:

unset($array["key1"]);

Para varias claves en una matriz:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

Espero que esto te ayude en tu desarrollo.


2

Entiendo que esta pregunta es antigua, pero creo que una forma óptima podría ser hacer esto:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

Ahora, puede usar $ name, $ email, ... desde cualquier lugar;)

NB: extract () no es seguro, por lo que está completamente fuera de discusión.


Por curiosidad, ¿por qué extract () no es seguro?
— Srdjan Marjanovic


Oh! ¡Buena! ¡Gracias!
— Srdjan Marjanovic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.