Besserer Weg, um mehrere Array-Elemente zu deaktivieren

81

Der Deal hier ist, dass ich ein Array mit 17 Elementen habe. Ich möchte die Elemente, die ich für eine bestimmte Zeit benötige, abrufen und dauerhaft aus dem Array entfernen.

Hier ist der Code:

$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']);

Ja, der Code ist hässlich, keine Notwendigkeit zu schlagen. Wie mache ich das besser?

Schildkröte
quelle

Antworten:

104

Verwenden Sie zum Entfernen array_diff_key

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

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

Sie können array_intersect_key verwenden, wenn Sie ein Array von Schlüsseln bereitstellen möchten, die beibehalten werden sollen.

Tim
quelle
6
Verstehe nicht, warum diese Methode nicht als die beste Antwort akzeptiert wird, da sie tatsächlich als Zauber wirkt !!
Alex
Brillant! Schön. Ich mag dies, anstatt das Array zu durchlaufen und Elemente zu deaktivieren.
Lifo
1
Schlaue Lösung!!
MAZux
intelligent aber langsam für große Eingabearrays. foreach unset scheint mit großen Eingabearrays und (zumindest) einer relativ kleinen Anzahl von Schlüsseln, die nicht gesetzt werden sollen, viel schneller zu sein.
Slepic
100

Es sieht so aus, als extract()wäre die Funktion ein besseres Werkzeug für das, was Sie tun möchten (vorausgesetzt, sie extrahiert alle Schlüssel / Werte aus einem Array und weist sie Variablen mit denselben Namen wie die Schlüssel im lokalen Bereich zu). Nachdem Sie den Inhalt extrahiert haben, können Sie den gesamten Inhalt deaktivieren $post, vorausgesetzt, er enthält nichts anderes, was Sie möchten.

Um Ihre Frage tatsächlich zu beantworten, können Sie jedoch ein Array der Schlüssel erstellen, die Sie entfernen und durchlaufen möchten, und sie explizit deaktivieren ...

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

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

... oder Sie können die Variable auf ein neues Array verweisen, bei dem die Schlüssel entfernt wurden ...

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

... oder übergeben Sie alle Array-Mitglieder an unset()...

unset($arr['name'],  $arr['email']);
Alex
quelle
8
array_diff_key () ist eine gute Lösung. Ich dachte, ich würde hinzufügen, dass Sie array_intersect_key () verwenden können , um das Gegenteil zu tun, behalten Sie nur bestimmte Elemente
batfastad
1
Ich bin mit bbradley - array_diff_key ist eine großartige Lösung
Michael
Zufällig habe ich dieses Ding nur mit dem foreach gemacht, das nicht eingestellt war. Dann dachte ich, es könnte eine bessere Lösung geben. Google hat mich hierher geführt. Also habe ich array_diff_key ausprobiert und es stellt sich heraus, dass es für große Eingabearrays viel langsamer ist als foreach (zumindest wenn die Anzahl der zu deaktivierenden Schlüssel relativ gering ist).
Slepic
46

Es gibt einen anderen Weg, der besser ist als die obigen Beispiele. Quelle: http://php.net/manual/en/function.unset.php

Anstatt das gesamte Array zu durchlaufen und alle Schlüssel zu deaktivieren, können Sie es einfach einmal wie folgt deaktivieren:

Beispielarray:

$array = array("key1", "key2", "key3");

Für das gesamte Array:

unset($array);

Für eindeutige Schlüssel:

unset($array["key1"]);

Für mehrere Schlüssel in einem Array:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

Ich hoffe das hilft dir bei deiner Entwicklung.

CodingDaily
quelle
2

Ich verstehe, dass diese Frage alt ist, aber ich denke, ein optimaler Weg könnte sein, dies zu tun:

$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 */
}

Jetzt können Sie $ name, $ email, ... von überall aus verwenden;)

NB: extract () ist nicht sicher, kommt also nicht in Frage!

Felix Imafidon
quelle
Aus Neugier - warum ist extract () nicht sicher?
Srdjan Marjanovic
@SrdjanMarjanovic stackoverflow.com/questions/829407/…
Andrew
Oh! Gut! Vielen Dank!
Srdjan Marjanovic