2011-10-25 21 views
49

El problema 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.Mejor manera de desarmar múltiples elementos 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']); 

Si el código es feo, no hay necesidad de Bash. ¿Cómo hago que se vea mejor?

Respuesta

67

Parece que la función extract() sería una mejor herramienta para lo que intenta hacer (suponiendo 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, podría deshacer el entero $post, suponiendo que no contenga nada más que desee.

Sin embargo, para responder a su pregunta en realidad, se podría crear una matriz de las teclas que desea eliminar y, a través del bucle, unsetting explícitamente ...

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

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

... o usted podría señalar la variable a una nueva matriz que tiene las llaves removidos ...

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

... o pasar todas las miembros de la matriz a unset() ...

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

[matriz_diff_key()] (http: // php.net/manual/es/function.array-diff-key.php) es una buena solución. Pensé que agregaría que puede usar [matriz_intersección_clave()] (http://php.net/manual/en/function.array-intersect-key.php) para hacer lo contrario, mantener solo ciertos elementos – batfastad

+1

Estoy con bbradley - array_diff_key es la gran solución – Michael

2

entiendo esta pregunta es viejo, pero creo que una manera óptima podría ser la de 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 utilizar $ nombre, $ correo electrónico, desde cualquier lugar ...;)

NB: extract() no es seguro, ¡por lo que está completamente fuera de duda!

32

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

En lugar de bucle a fondo toda la matriz y desarmar todas sus claves, sólo puede desarmar una vez, así:

Ejemplo de Array:

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

Para toda la matriz:

unset($array); 

Para las claves únicas:

unset($array["key1"]); 

Por varias claves en una matriz:

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

espero que esto le ayuda en su desarrollo.

40

Uso array_diff_key para eliminar

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

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

usted podría utilizar array_intersect_key si desea suministrar una matriz de claves a tener.

+3

No entiendo por qué este método no se acepta como la respuesta ganadora, ya que realmente funciona como un encanto. –

+0

Brillante! Buena esa. Me gusta esto en lugar de recorrer el conjunto y deshacer los elementos. – lifo

+0

Solución inteligente !! – MAZux

Cuestiones relacionadas