Eficiencia del uso de bucles foreach para borrar los valores de una matriz de PHP

4 minutos de lectura

avatar de usuario de el_pup_le
el_pup_le

¿Cuál es más eficiente para borrar todos los valores en una matriz? El primero me requeriría usar esa función cada vez en el ciclo del segundo ejemplo.

foreach ($array as $i => $value) {
    unset($array[$i]);
}

O esto

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

no quiero usar unset() porque eso elimina la variable.

  • Sí, pero ¿por qué querrías evaluar una matriz nula que configuraste de esa manera?

    – Blake

    21 de abril de 2012 a las 18:50

  • ¿Fuente? No parece que ninguna variable en la memoria sea más pequeña que var es nula.

    – Blake

    21 de abril de 2012 a las 18:53

Avatar de usuario de Eric Herlitz
eric herlitz

Como dijo Zack en los comentarios a continuación, puede simplemente volver a crear una instancia usando

$foo = array(); // $foo is still here

Si desea algo más poderoso, use unset, ya que también borrará $ foo de la tabla de símbolos, si necesita la matriz más adelante, vuelva a crear una instancia.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

Si estamos hablando de mesas muy grandes, probablemente recomendaría

$foo = null; 
unset($foo); 

ya que eso también borraría un poco mejor la memoria. Sin embargo, ese comportamiento (GC) no es muy constante y puede cambiar con las versiones de PHP. Tenga en cuenta que volver a instanciar una estructura no es lo mismo que vaciarla.

  • si es una matriz global

    – Nisham Mahsin

    03/04/2014 a las 14:26

  • @NishamMahsin Cualquiera de los dos usos global $foo; unset($foo); o unset($GLOBALS['foo']);

    –Eric Herlitz

    03/04/2014 a las 15:29

  • unset() a veces es muy malo y puede causar problemas, si lo usa mal. No responde correctamente la respuesta de los OP. No sé por qué aceptó esto como la mejor respuesta, su comentario sobre su propia pregunta dice que el problema con la desactivación es que elimina la variable. Para ver qué problemas causa esta solución, echa un vistazo a mi respuesta aquí.

    – Wolfsblvt

    10 de diciembre de 2014 a las 14:28


avatar de usuario de mpen
mpen

Si solo desea restablecer una variable a una matriz vacía, simplemente puede reiniciarla:

$foo = array();

Tenga en cuenta que esto mantendrá cualquier referencia a él:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

Si desea romper cualquier referencia a él, desactívelo primero:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged

  • Este es mi código: justpaste.it/1gt46. ¿Cómo puedo declarar más de una identificación en variable? La declaración de valor único es: $productId = 19; ¿Cómo puedo declarar más de un valor en $productId=?

    – Gema

    8 de febrero de 2018 a las 8:53

  • @Rathinam No estoy seguro de qué tiene que ver eso con borrar una matriz. Publique una nueva pregunta en Stackoverflow y pegue su código directamente en la pregunta.

    – mpen

    8 de febrero de 2018 a las 17:07

Avatar de usuario de Wolfsblvt
Wolfsblvt

Desarmar la variable es una buena manera, ¡a menos que necesite la referencia de la matriz original!

Para aclarar lo que quiero decir: si tiene una función que usa la referencia de la matriz, por ejemplo, una función de clasificación como

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);
    
    sort_my_list($temporary_list);
    
    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

¡no está trabajando! Ten cuidado aquí, unset elimina la referencia, por lo que la variable $array se crea de nuevo y se rellena correctamente, pero no se puede acceder a los valores desde fuera de la función.

Entonces, si tiene referencias, debe usar $array = array() en vez de unsetincluso si es menos limpio y comprensible.

Diría lo primero, si la matriz es asociativa. Si no, utilice un for círculo:

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

Aunque si es posible, utilizando

$array = array();

Es preferible restablecer la matriz a una matriz vacía.

no es unset() ¿suficientemente bueno?

unset($array);

Avatar de usuario de Bibhas Debnath
Bibhas Debnath

Qué tal si $array_name = array(); ?

avatar de usuario de p1100i
p1100i

Usar array_splice para vaciar una matriz y conservar la referencia:

array_splice($myArray, 0);

¿Ha sido útil esta solución?