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?

Tortuga
fuente

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.

Tim
fuente
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']);
alex
fuente
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.

Codificación diaria
fuente
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.

Felix Imafidon
fuente
Por curiosidad, ¿por qué extract () no es seguro?
Srdjan Marjanovic
@SrdjanMarjanovic stackoverflow.com/questions/829407/…
Andrew
Oh! ¡Buena! ¡Gracias!
Srdjan Marjanovic