La mejor manera de borrar los valores de una matriz PHP

172

¿Cuál es más eficiente para borrar todos los valores en una matriz? La primera requeriría que use 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;
}
el_pup_le
fuente
55
¿Qué tiene de malo unset($array)?
Blake
13
elimina la variable
el_pup_le
2
Sí, pero ¿por qué querrías evaluar una matriz nula que estableces de esa manera?
Blake
3
¿Fuente? No parece que ninguna variable en la memoria sea más pequeña que var es nula.
Blake

Respuestas:

256

Como dijo Zack en los comentarios a continuación, simplemente puede 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, simplemente ejemplifique nuevamente.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
fuente
63
¿Por qué no simplemente volver a crear una instancia como $foo = array();?
Zack Zatkin-Gold
2
@NishamMahsin Usa global $foo; unset($foo);ounset($GLOBALS['foo']);
Eric Herlitz
77
@vivoconunxino Lo escribí de esa manera debido a la pregunta de los autores "La mejor manera de borrar los valores de una matriz PHP". Dice 'claro', no 'nueva instancia'. El uso unsetse borrará $foode la tabla de símbolos. Estoy hablando de tablas muy grandes que probablemente recomendaría, $foo = null; unset($foo);ya que eso también despejaría la memoria un poco mejor. Sin embargo, ese comportamiento (GC) no es muy constante y puede cambiar en las versiones de PHP.
Eric Herlitz
55
unset () a veces es muy malo y puede causar problemas, si lo usa mal. No responde la respuesta de los OP correctamente. No sé por qué aceptó esto como la mejor respuesta, su comentario sobre su propia pregunta dice que el problema con unset es que elimina la variable. Para ver qué problemas causa esta solución, eche un vistazo a mi respuesta aquí .
Wolfsblvt
2
Para todos los que lo apoyan $foo = array();: en realidad puede haber un problema conceptual en él: volver a crear una instancia de una estructura no es lo mismo que vaciarla. Cuando se trata de memoria, sabe que no es lo mismo que la asignación es lenta. Entonces, a pesar de la facilidad de uso, la reiniciación podría no ser la respuesta a esta pregunta, especialmente si uno necesita hacerlo muchas veces y rápidamente. Podría funcionar, pero eso dependería en gran medida de la gestión de memoria PHP, IMO.
TechNyquist
82

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 alguna 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
mpen
fuente
3
Creo que esta es la mejor respuesta. Debe ser aceptado Muestra la forma más simple y también describe por qué y cuándo se unsetdebe usar. +1
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
@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
32

Lamentablemente, no puedo responder las otras preguntas, no tengo suficiente reputación, pero necesito señalar algo que fue MUY importante para mí, y creo que también ayudará a otras personas.

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 utiliza 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! Tenga cuidado aquí, unsetelimina la referencia, por lo que la variable $arrayse crea nuevamente y se llena correctamente, pero los valores no son accesibles desde fuera de la función.

Por lo tanto, si tiene referencias, debe usarlas en $array = array()lugar de hacerlo unset, incluso si es menos limpio y comprensible.

Wolfsblvt
fuente
3
esta debería ser la respuesta: el OP dice valores claros de matrices, no desreferenciar toda la variable de matriz.
Ross
13

Yo diría el primero, si la matriz es asociativa. Si no, usa un forbucle:

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

Aunque si es posible, usando

$array = array();

Restablecer la matriz a una matriz vacía es preferible.

El fantasma de Madara
fuente
9

¿No es lo unset()suficientemente bueno?

unset($array);
John Conde
fuente
6

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

Bibhas Debnath
fuente
5

Use array_splicepara vaciar una matriz y retener la referencia:

array_splice($myArray, 0);

Allan Jardine
fuente
2

He usado unset () para borrar la matriz, pero me he dado cuenta de que unset () hará que la matriz sea nula, por lo tanto, la necesidad de volver a declarar la matriz como, por ejemplo,

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>
Bendición
fuente
1

Veo que estas preguntas son realmente antiguas, pero para ese problema escribí una función recursiva para desarmar todos los valores en una matriz. Recursivo porque es posible que los valores de la matriz dada también sean una matriz. Entonces eso funciona para mí:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

Entonces con eso obtengo la matriz con todas las claves y sub-matrices, pero con valores vacíos.

Bueck0815
fuente
1

Quizás de manera simple y económica (menos signos de uso) ...

$array = [];

Podemos leer en el manual de php:

A partir de PHP 5.4 también puede usar la sintaxis de matriz corta, que reemplaza a array () con [].

PHP php
fuente
También deberías explicarlo.
Kulshreshth K
0

El unset función es útil cuando el recolector de basura realiza sus rondas mientras no tiene un descanso para almorzar;

sin embargo, la función no establecida simplemente destruye la referencia variable a los datos, los datos aún existen en la memoria y PHP ve la memoria como en uso a pesar de que ya no tiene un puntero.

Solución: Asigne nulla sus variables para borrar los datos, al menos hasta que el recolector de basura los consiga.

$var = null;

y luego desarmarlo de manera similar!

unset($var);
Waqar Alamgir
fuente
44
Eso no suena bien. No creo que configurarlo nullforzará una recolección de basura inmediata. Tienes una referencia para eso?
mpen
@mpen ¿Acepta que la asignación NULLreemplazará el valor almacenado en la ubicación de la $varvariable en este ejemplo?
Anthony Rutledge
1
@AnthonyRutledge No, no lo hago. Por lo que sé, PHP simplemente se actualizará $varpara apuntar a algún NULLobjeto global y dejará $varsolo los datos hasta que se recolecte basura. ¿Por qué el intérprete se vería obligado a sobrescribir esos datos de inmediato?
mpen
@mpen Esa es una buena pregunta, pero en ese mundo al menos todo está listo para ser recogido.
Anthony Rutledge
En efecto. El punto es que dudo que configurarlo como nulo antes de desarmarlo ayude a cualquiera
mpen
-1

Esto es poderoso y probado sin establecer ($ gradearray); // restablecer la matriz

Charles
fuente
1
Para responder a la pregunta, debe explicar cuál es la mejor manera y por qué
Fabian Horlacher