Der beste Weg, um die Werte eines PHP-Arrays zu löschen

171

Was ist effizienter, um alle Werte in einem Array zu löschen? Beim ersten würde ich diese Funktion jedes Mal in der Schleife des zweiten Beispiels verwenden müssen.

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

Oder dieses

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
quelle
5
Was ist los mit unset($array)?
Blake
12
löscht die Variable.
el_pup_le
2
Ja, aber warum sollten Sie ein Null-Array auswerten, das Sie so festgelegt haben?
Blake
3
Quelle? Keine Variable im Speicher scheint nicht kleiner zu sein als var ist null.
Blake

Antworten:

255

Wie Zack in den Kommentaren unten sagte, können Sie es einfach mit neu instanziieren

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

Wenn Sie etwas Stärkeres verwenden möchten, verwenden Sie unset, da dadurch auch $ foo aus der Symboltabelle gelöscht wird. Wenn Sie das Array später benötigen, instanziieren Sie es einfach erneut.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
quelle
63
Warum nicht einfach neu instanziieren als $foo = array();?
Zack Zatkin-Gold
2
@ NishamMahsin Entweder verwenden global $foo; unset($foo);oderunset($GLOBALS['foo']);
Eric Herlitz
7
@vivoconunxino Ich habe es so geschrieben, weil die Autoren gefragt haben, wie man die Werte eines PHP-Arrays am besten löscht. Es ist "klar", nicht "neue Instanz". Mit unsetwird $fooaus der Symboltabelle gelöscht. Ich spreche von sehr großen Tabellen, die ich wahrscheinlich empfehlen würde, $foo = null; unset($foo);da dies auch den Speicher etwas besser löschen würde. Dieses Verhalten (GC) ist jedoch nicht sehr konstant und kann sich gegenüber PHP-Versionen ändern.
Eric Herlitz
5
unset () ist manchmal sehr schlecht und kann Probleme verursachen, wenn Sie es falsch verwenden. Die Antwort des OP wird nicht richtig beantwortet. Ich weiß nicht, warum er dies als beste Antwort akzeptiert hat. Sein Kommentar zu seiner eigenen Frage besagt, dass das Problem mit unset darin besteht, dass die Variable gelöscht wird. Um zu sehen, welche Probleme diese Lösung verursacht, werfen Sie einen Blick auf meine Antwort hier .
Wolfsblvt
2
Für alle Unterstützer $foo = array();: Tatsächlich könnte ein konzeptionelles Problem darin liegen: Das erneute Instanziieren einer Struktur ist nicht dasselbe wie das Leeren. Wenn Sie sich mit Speicher beschäftigen, wissen Sie, dass dies nicht dasselbe ist, da die Zuordnung langsam ist. Trotz der Benutzerfreundlichkeit ist eine erneute Instanziierung möglicherweise nicht die Antwort auf diese Frage, insbesondere wenn dies häufig und schnell erledigt werden muss. Es könnte funktionieren, aber das würde stark von der PHP-Speicherverwaltung IMO abhängen.
TechNyquist
81

Wenn Sie eine Variable nur auf ein leeres Array zurücksetzen möchten, können Sie sie einfach neu initialisieren:

$foo = array();

Beachten Sie, dass hierdurch alle Verweise darauf beibehalten werden:

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

Wenn Sie Verweise darauf aufheben möchten, deaktivieren Sie diese zuerst:

$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
quelle
3
Ich denke, das ist die beste Antwort. Sollte akzeptiert werden. Es zeigt den einfachsten Weg und beschreibt auch, warum und wann unsetverwendet werden sollte. +1
Dies ist mein Code: justpaste.it/1gt46 . Wie kann ich mehr als eine ID in einer Variablen deklarieren? Die Einzelwertdeklaration lautet: $ productId = 19; Wie kann ich mehr als einen Wert in $ productId = deklarieren?
Gem
@ Rathinam Ich bin mir nicht sicher, was das mit dem Löschen eines Arrays zu tun hat. Bitte posten Sie eine neue Frage auf Stackoverflow und fügen Sie Ihren Code direkt in die Frage ein.
Mpen
31

Leider kann ich die anderen Fragen nicht beantworten, habe nicht genug Ruf, aber ich muss auf etwas hinweisen, das für mich SEHR wichtig war, und ich denke, es wird auch anderen Menschen helfen.

Das Deaktivieren der Variablen ist eine gute Möglichkeit, es sei denn, Sie benötigen die Referenz des ursprünglichen Arrays!

Um klar zu machen, was ich meine: Wenn Sie eine Funktion haben, die die Referenz des Arrays verwendet, zum Beispiel eine Sortierfunktion wie

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

es funktioniert nicht! Seien Sie hier vorsichtig, unsetlöschen Sie die Referenz, damit die Variable $arrayerneut erstellt und korrekt gefüllt wird, aber auf die Werte von außerhalb der Funktion nicht zugegriffen werden kann.

Also , wenn Sie Referenzen haben, müssen Sie verwenden $array = array()statt unset, auch wenn es weniger sauber und verständlich ist.

Wolfsblvt
quelle
3
Dies sollte die Antwort sein - das OP sagt Clear Arrays-Werte, nicht die Referenzierung der gesamten Array-Variablen.
Ross
13

Ich würde das erste sagen, wenn das Array assoziativ ist. Wenn nicht, verwenden Sie eine forSchleife:

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

Obwohl wenn möglich mit

$array = array();

Das Zurücksetzen des Arrays auf ein leeres Array ist vorzuziehen.

Madaras Geist
quelle
9

Ist das nicht unset()gut genug

unset($array);
John Conde
quelle
6

Wie wäre es $array_name = array();?

Bibhas Debnath
quelle
5

Verwenden Sie array_splicediese Option, um ein Array zu leeren und die Referenz beizubehalten:

array_splice($myArray, 0);

Allan Jardine
quelle
2

Ich habe unset () verwendet, um das Array zu löschen, aber ich habe festgestellt, dass unset () das Array null macht, daher muss das Array wie zum Beispiel neu deklariert werden

<?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
?>
Segen
quelle
1

Ich sehe, dass diese Fragen sehr alt sind, aber für dieses Problem habe ich eine rekursive Funktion geschrieben, um alle Werte in einem Array zu deaktivieren. Rekursiv, da es möglich ist, dass Werte aus dem angegebenen Array auch ein Array sind. Das funktioniert also bei mir:

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;

}

Damit bekomme ich das Array mit allen Schlüsseln und Sub-Arrays, aber leeren Werten.

Bueck0815
quelle
1

Vielleicht einfach, wirtschaftlich (weniger Zeichen zu benutzen) ...

$array = [];

Wir können im PHP-Handbuch lesen:

Ab PHP 5.4 können Sie auch die kurze Array-Syntax verwenden, die array () durch [] ersetzt.

PHP php
quelle
Sie sollten es auch erklären.
Kulshreshth K
0

Die nicht gesetzte Funktion ist nützlich, wenn der Garbage Collector seine Runden macht, während er keine Mittagspause hat.

Wenn die nicht gesetzte Funktion jedoch einfach die Variablenreferenz auf die Daten zerstört, sind die Daten immer noch im Speicher vorhanden, und PHP sieht den Speicher als verwendet an, obwohl kein Zeiger mehr darauf vorhanden ist.

Lösung: Weisen Sie nullIhren Variablen zu, um die Daten zu löschen, zumindest bis der Garbage Collector sie erfasst.

$var = null;

und dann auf ähnliche Weise deaktivieren!

unset($var);
Waqar Alamgir
quelle
4
Das klingt nicht richtig. Ich glaube nicht, dass nulleine sofortige Speicherbereinigung erzwungen wird. Haben Sie eine Referenz dafür?
Mpen
@mpen Stimmen Sie zu, dass die Zuweisung NULLden Wert ersetzt, der $varin diesem Beispiel am Speicherort der Variablen gespeichert ist ?
Anthony Rutledge
1
@AnthonyRutledge Nein, ich nicht. Soweit ich weiß, wird PHP einfach aktualisiert $var, um auf ein globales NULLObjekt zu verweisen und die $varDaten in Ruhe zu lassen, bis der Müll gesammelt ist. Warum sollte der Dolmetscher gezwungen sein, diese Daten sofort zu überschreiben?
Mpen
@mpen Das ist eine gute Frage, aber in dieser Welt ist zumindest alles bereit, gesammelt zu werden.
Anthony Rutledge
Tatsächlich. Punkt ist , dass ich es auf null Zweifel Einstellung vor unsetting es wird helfen , jede
MPde
-1

Dies ist leistungsstark und wurde nicht gesetzt getestet ($ gradearray); // setze das Array zurück

Charles
quelle
1
Um die Frage zu beantworten, sollten Sie erklären, welcher Weg der beste ist und warum
Fabian Horlacher