Il modo migliore per cancellare i valori di un array PHP


172

Qual è più efficiente per cancellare tutti i valori in un array? Il primo mi richiederebbe di usare quella funzione ogni volta nel ciclo del secondo esempio.

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

O questo

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

5
Cosa c'è che non va unset($array)?
Blake,

13
elimina la variabile.
el_pup_le

2
Sì, ma perché dovresti voler valutare un array null impostato in questo modo?
Blake,

3
Fonte? Nessuna variabile in memoria non sembra essere più piccola di var è null.
Blake,

Risposte:


256

Come ha detto Zack nei commenti qui sotto, puoi semplicemente ri-istanziarlo usando

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

Se vuoi qualcosa di più potente usa unset dato che cancellerà anche $ foo dalla tabella dei simboli, se in seguito hai bisogno dell'array per istanziarlo di nuovo.

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

63
Perché non ri-istanziarlo come $foo = array();?
Zack Zatkin-Gold,

2
@NishamMahsin Usa global $foo; unset($foo);ounset($GLOBALS['foo']);
Eric Herlitz,

7
@vivoconunxino L'ho scritto in questo modo a causa della domanda degli autori "Il modo migliore per cancellare i valori di un array PHP". È "chiaro", non "nuova istanza". L'uso unsetverrà cancellato $foodalla tabella dei simboli. Sto parlando di tavoli molto grandi che probabilmente consiglierei, $foo = null; unset($foo);dato che anche questo cancellerebbe un po 'meglio la memoria. Tale comportamento (GC) non è tuttavia molto costante e può cambiare rispetto alle versioni di PHP.
Eric Herlitz,

5
unset () a volte è molto male e può causare problemi, se lo si utilizza in modo errato. Non risponde correttamente alla risposta dei PO. Non so perché abbia accettato questa come migliore risposta, il suo commento sulla sua stessa domanda dice che il problema con unset è che cancella la variabile. Per vedere quali problemi causano queste soluzioni, dai un'occhiata alla mia risposta qui .
Wolfsblvt,

2
A tutto supporto $foo = array();: in realtà potrebbe esserci un problema concettuale in esso: ri-istanziare una struttura non è la stessa cosa di svuotarla. Quando si ha a che fare con la memoria, si sa che non è la stessa cosa che l'allocazione è lenta. Quindi, nonostante la facilità d'uso, la ri-istanziazione potrebbe non essere la risposta a questa domanda, specialmente se è necessario farlo molte volte e rapidamente. Potrebbe funzionare, ma farebbe molto affidamento sulla gestione della memoria PHP, IMO.
TechNyquist,

82

Se vuoi solo ripristinare una variabile su un array vuoto, puoi semplicemente reinizializzarla:

$foo = array();

Si noti che ciò manterrà qualsiasi riferimento ad esso:

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

Se vuoi rompere qualsiasi riferimento ad esso, disattivalo prima:

$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

3
Penso che questa sia la risposta migliore. Dovrebbe essere accettato Mostra il modo più semplice e descrive anche perché e quando unsetdovrebbe essere usato. +1

Questo è il mio codice: justpaste.it/1gt46 . Come posso dichiarare più di un ID nella variabile. La dichiarazione a valore singolo è: $ productId = 19; Come posso dichiarare più di un valore in $ productId =?
Gemma

@Rathinam Non sono sicuro di cosa abbia a che fare con la cancellazione di un array. Pubblica una nuova domanda su StackOverflow e incolla il codice direttamente nella domanda.
aprono l'

32

Purtroppo non posso rispondere alle altre domande, non ho abbastanza reputazione, ma devo sottolineare qualcosa che è MOLTO importante per me e penso che aiuterà anche le altre persone.

Disattivare la variabile è un buon modo, a meno che non sia necessario il riferimento dell'array originale!

Per chiarire cosa intendo: se si dispone di una funzione che utilizza il riferimento dell'array, ad esempio una funzione di ordinamento come

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;
    }
}

non funziona! Fai attenzione qui, unsetelimina il riferimento, quindi la variabile $arrayviene nuovamente creata e riempita correttamente, ma i valori non sono accessibili dall'esterno della funzione.

Quindi, se hai riferimenti, devi usare $array = array()invece di unset, anche se è meno pulito e comprensibile.


3
questa dovrebbe essere la risposta - l'OP dice valori di array chiari, non de-riferimento all'intera variabile di array.
Ross,

13

Direi il primo, se l'array è associativo. In caso contrario, utilizzare un forloop:

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

Anche se possibile, usando

$array = array();

È preferibile ripristinare l'array su un array vuoto.





2

ho usato unset () per cancellare l'array ma ho capito che unset () renderà l'array null quindi la necessità di ri-dichiarare l'array come ad esempio

<?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
?>

1

Vedo che questa domanda è molto vecchia, ma per quel problema ho scritto una funzione ricorsiva per disinserire tutti i valori in un array. Ricorsivo perché è possibile che i valori della matrice data siano anche una matrice. Quindi funziona per me:

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;

}

Quindi, con ciò ottengo l'array con tutte le chiavi e gli array secondari, ma i valori vuoti.


1

Forse un modo semplice ed economico (meno segni da usare) ...

$array = [];

Possiamo leggere nel manuale di php:

A partire da PHP 5.4 puoi anche usare la sintassi della matrice corta, che sostituisce la matrice () con [].


Dovresti anche spiegarlo.
Kulshreshth K

0

La funzione unset è utile quando il garbage collector sta facendo il suo giro senza fare una pausa pranzo;

tuttavia la funzione unset semplicemente distrugge il riferimento variabile ai dati, i dati esistono ancora in memoria e PHP vede la memoria come in uso nonostante non abbia più un puntatore ad esso.

Soluzione: assegnare nullalle variabili per cancellare i dati, almeno fino a quando il Garbage Collector non riesce a bloccarli.

$var = null;

e poi disinserirlo in modo simile!

unset($var);

4
Non suona bene. Non penso che impostarlo su nullforzerà una raccolta dei rifiuti immediata. Hai un riferimento per questo?
mpen

@mpen Sei d'accordo che l'assegnazione NULLsostituirà il valore memorizzato nella posizione della $varvariabile in questo esempio?
Anthony Rutledge,

1
@AnthonyRutledge No, non lo so. Per quanto ne so, PHP si aggiornerà semplicemente $varper indicare un NULLoggetto globale e lascerà $vari dati da soli fino a quando non saranno raccolti. Perché l'interprete dovrebbe essere costretto a sovrascrivere immediatamente quei dati?
Aprire il

Questa è una buona domanda, ma in quel mondo almeno tutto è pronto per essere raccolto.
Anthony Rutledge,

Infatti. Il punto è che dubito che impostarlo su null prima di
annullare l'impostazione

-1

Questo è potente e testato unset ($ gradearray); // ripristina l'array


1
Per rispondere alla domanda dovresti spiegare qual è il modo migliore e perché
Fabian Horlacher il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.