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?

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.


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

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.


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!


Aus Neugier - warum ist extract () nicht sicher?
Srdjan Marjanovic


Oh! Gut! Vielen Dank!
Srdjan Marjanovic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.