Ich bin sehr neu in mehrdimensionalen Arrays, und das nervt mich sehr.
Mein Array ist wie folgt:
$fields = array(
"names" => array(
"type" => "text",
"class" => "name",
"name" => "name",
"text_before" => "name",
"value" => "",
"required" => true,
)
)
Dann habe ich eine Funktion bekommen, die prüft, ob diese Eingaben ausgefüllt sind, wenn sie benötigt werden.
function checkForm($fields){
foreach($fields as $field){
if($field['required'] && strlen($_POST[$field['name']]) <= 0){
$fields[$field]['value'] = "Some error";
}
}
return $fields;
}
Jetzt ist mein Problem diese Linie
$fields[$field]['value'] = "Some error";
Ich möchte den Inhalt des ursprünglichen Arrays ändern, da ich dies zurückgebe, aber wie erhalte ich den Namen des aktuellen Arrays (Namen in diesem Beispiel) in meiner foreach-Schleife?
Antworten:
In PHP ist das Übergeben von reference (
&
) ... umstritten. Ich empfehle, es nicht zu verwenden, es sei denn, Sie wissen, warum Sie es benötigen, und testen die Ergebnisse.Ich würde Folgendes empfehlen:
Verwenden
$field
Sie es also grundsätzlich, wenn Sie die Werte benötigen und$fields[$key]
wenn Sie die Daten ändern müssen.quelle
foreach
kontrovers sein sollte. Es ist nicht so, als wäre es ein Funktionsaufruf mit versteckten Nebenwirkungen oder so.Verwendung
&
:&
Übergibt einen Wert des Arrays als Referenz und erstellt keine neue Instanz der Variablen. Wenn Sie also die Referenz ändern, ändert sich der ursprüngliche Wert.http://php.net/manual/en/language.references.pass.php
Edit 2018
Diese Antwort scheint von vielen Leuten im Internet favorisiert zu werden, weshalb ich beschlossen habe, weitere Informationen und vorsichtige Worte hinzuzufügen.
Während das Übergeben von Referenzen in
foreach
(oder Funktionen) eine saubere und kurze Lösung ist, kann dies für viele Anfänger eine gefährliche Gefahr sein.Dies kann ein ernstes Problem sein, wenn die Variablen im selben Bereich wiederverwendet werden. Eine andere SO-Frage zeigt deutlich, warum dies ein Problem sein könnte.
Das Deaktivieren eines Datensatzes oder das Ändern des Hashwerts (des Schlüssels) während der Iteration in derselben Schleife kann zu möglicherweise unerwarteten Verhaltensweisen in PHP <7 führen. Das Problem wird noch komplizierter, wenn das Array selbst eine Referenz ist.
Für jede Leistung.
Im Allgemeinen bevorzugt PHP aufgrund der Copy-on-Write-Funktion die Wertübergabe. Dies bedeutet, dass PHP intern keine doppelten Daten erstellt, es sei denn, die Kopie muss geändert werden. Es ist fraglich, ob eine Referenzübergabe
foreach
eine Leistungsverbesserung bieten würde. Wie immer müssen Sie Ihr spezifisches Szenario testen und feststellen, welche Option weniger Speicher und CPU-Zeit benötigt. Weitere Informationen finden Sie in dem unten von NikiC verlinkten SO-Beitrag.Lesbarkeit des Codes.
Das Erstellen von Referenzen in PHP gerät schnell außer Kontrolle. Wenn Sie ein Anfänger sind und nicht die volle Kontrolle darüber haben, was Sie tun, ist es am besten, sich von Referenzen fernzuhalten. Weitere Informationen zum
&
Operator finden Sie in diesem Handbuch: Referenz - Was bedeutet dieses Symbol in PHP?Für diejenigen, die mehr über diesen Teil der PHP-Sprache erfahren möchten: Erklärte PHP-Referenzen
Eine sehr schöne technische Erklärung von @NikiC zur internen Logik von PHP foreach-Schleifen:
Wie funktioniert PHP 'foreach' tatsächlich?
quelle
unset($value);
nach derforeach
schließenden Klammer hinzuzufügen , um sicherzustellen, dass die Referenzvariable nach der Iteration nicht mehr verfügbar ist. 3v4l.org/2V2AQVerwenden
foreach($fields as &$field){
Sie diese Option, damit Sie mit dem ursprünglichen Array arbeiten können.Hier erfahren Sie mehr über das Übergeben als Referenz.
quelle
Dies ist, was ich vorschlagen würde, als Referenz zu übergeben
quelle
$fields
?Versuche dies
quelle