Mejor manera de desarmar múltiples elementos de matriz

4 minutos de lectura

avatar de usuario
Tortuga

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 hay necesidad de golpear. ¿Cómo hago que esto se vea mejor?

  • Esto es casi seguro que es un Problema XY. Probablemente no haya ninguna razón beneficiosa para desarmar estos elementos. Y si tiene inquietudes con respecto al alcance variable, puede haber mejores formas de abordarlas que desarmar explícitamente, pero no podemos aconsejarle sin más/mejor contexto.

    – mickmackusa

    10 de mayo a las 7:13

avatar de usuario
Tim

Usar array_diff_key para eliminar

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

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

podrías usar array_intersect_key si desea proporcionar una matriz de claves para conservar.

  • inteligente pero lento para matrices de entrada grandes. foreach unset parece mucho más rápido con grandes matrices de entrada y (al menos) una cantidad relativamente pequeña de claves para desarmar.

    – soñoliento

    26 de octubre de 2019 a las 7:07

  • Tenga cuidado: si el valor del campo que desea eliminar es igual al índice del elemento (invertido) que desea eliminar, la clave no se eliminará. Puede conducir a problemas de seguridad al exponer los datos. Puedes ver los resultados aquí: replit.com/@xbeat/unset-array-of-key#index.php

    – Giuseppe Canale

    15 de junio a las 15:00

  • Gran punto @Giuseppe Canale gracias por eso

    – Tim

    16 de junio a las 21:01

avatar de usuario
Alex

Parece la función extract() sería una mejor herramienta para lo que está tratando de hacer (suponiendo que extraiga todas las claves/valores de una matriz y las asigne a variables con los mismos nombres que las claves en el ámbito local). Después de extraer el contenido, puede desarmar todo el $postasumiendo que no contenía nada más que quisieras.

Sin embargo, para responder realmente a su pregunta, puede crear una matriz de las teclas que desea eliminar y recorrerlas, deshabilitándolas explícitamente …

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

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

…o podría apuntar la variable a una nueva matriz a la que se le han quitado las claves…

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

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

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

  • array_diff_key() es una buena solución. Pensé que agregaría que puedes usar array_intersect_key() para hacer lo contrario, mantener solo ciertos elementos

    – Batfastad

    26 de julio de 2014 a las 0:34


  • Por casualidad, solo estaba haciendo esto con el foreach desactivado. Entonces pensé que podría haber una solución mejor. 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 desactivar es relativamente pequeña).

    – soñoliento

    26 de octubre de 2019 a las 7:04


  • Tenga cuidado al usar la solución array_flip: si el valor del campo que desea eliminar es igual al índice del elemento (invertido) que desea eliminar, la clave no se eliminará. Puede conducir a problemas de seguridad al exponer los datos. Puede ver los resultados aquí: replit.com/@xbeat/unset-array-of-key#index.php

    – Giuseppe Canale

    15 de junio a las 15:06

avatar de usuario
CodificaciónDiario

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

En lugar de recorrer todo el arreglo y desarmar todas sus claves, puede simplemente 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.

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, puedes usar $nombre, $correo electrónico, … desde cualquier lugar 😉

NB: extract() no es seguro, ¡así que está completamente fuera de discusión!

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



   
   $myArray = array_except($post, ['name', 'email','address','telephone','country']);
   
  print_r($myArray);
  
  
   
  function array_except($array, $keys){
    foreach($keys as $key){
        unset($array[$key]);
    }
    return $array;
  }
?>

  • ¿Esta respuesta no repite las ideas publicadas anteriormente?

    – mickmackusa

    10 de mayo a las 6:18

avatar de usuario
levon babayan

En php, la función unset puede tomar múltiples argumentos

$test = ['test1' => 1, 'test2' => 4, 'test34' => 34];

unset($test['test1'], $test['test34']);

Aquí está esta descripción de la documentación.

unset(mixed $var, mixed ...$vars): void

  • ¿Esta respuesta no repite las ideas publicadas anteriormente?

    – mickmackusa

    10 de mayo a las 6:18

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad