Bei der Behandlung von PHP -Arrays ist Array_flip () eine scheinbar einfache, aber versteckte Risikofunktion. Sein Zweck ist, aber wenn Sie sie direkt für von Benutzer bereitgestellte Daten verwenden, kann es eine Reihe von Problemen auslösen, die Sie nicht erwartet haben.
In diesem Artikel wird die potenziellen Fallstricke von Array_flip () anhand von Beispielen analysiert und sicherere Alternativen bieten, um robustere PHP -Anwendungen aufzubauen.
Die grundlegende Verwendung von Array_flip () ist sehr intuitiv:
$original = [
'apple' => 'fruit',
'carrot' => 'vegetable'
];
$flipped = array_flip($original);
print_r($flipped);
Ausgabe:
Array
(
[fruit] => apple
[vegetable] => carrot
)
Es ändert den Wert in einen Schlüssel und den Schlüssel zu einem Wert. Dies ist in einigen Szenarien sehr nützlich, beispielsweise wenn Sie "Schlüssel" schnell auf "Werten" finden möchten. Das Problem ist jedoch auch in dieser Definition versteckt.
Array_flip () verlangt, dass alle Werte beim Umdrehen eindeutig und entscheidend sein müssen. Wenn Sie in Ihrem Array doppelte Werte haben, überschreiben Sie die vorherigen Daten leise, ohne Fehleranforderungen anzugeben.
Schauen wir uns ein Beispiel für Benutzerdaten an:
$userInput = [
'user1' => 'admin',
'user2' => 'editor',
'user3' => 'admin' // Wert wiederholen
];
$flipped = array_flip($userInput);
print_r($flipped);
Die Ausgabe ist:
Array
(
[admin] => user3
[editor] => user2
)
Glaubst du, Admin entspricht User1 ? Nein, User3 überschreibt es. Dies kann bei der Verarbeitung von Benutzerrollen, Berechtigungen, Tags und anderen Daten leicht logische Fehler verursachen.
Arrayschlüssel in PHP können nur Ganzzahlen oder Saiten sein. Wenn der vom Benutzer eingereichte Array ein Array oder Objekt als Werte enthält, wirft Array_flip () eine Warnung aus und ignoriert diese Elemente.
$userInput = [
'key1' => 'value1',
'key2' => ['not' => 'allowed'],
'key3' => 'value3'
];
$flipped = array_flip($userInput);
print_r($flipped);
Ausgabe:
Warning: array_flip(): Can only flip STRING and INTEGER values!
Array
(
[value1] => key1
[value3] => key3
)
Diese Warnung kann in einer Entwicklungsumgebung gesehen werden, jedoch in einer Produktionsumgebung versteckt, und infolgedessen erhalten Sie ein Array, das normal aussieht, aber Daten gebrochen hat .
Auch wenn die Werte gleich aussehen, unterscheidet Array_flip () die Typen streng. Beispielsweise werden die Zeichenfolge "1" und die Ganzzahl 1 als der gleiche Schlüssel behandelt, der zu Überschreibungen führt.
$userInput = [
'a' => 1,
'b' => '1'
];
$flipped = array_flip($userInput);
print_r($flipped);
Ausgabe:
Array
(
[1] => b
)
Der Schlüssel "A" ist völlig verloren.
Wenn Sie die Funktion von Back-Checing-Schlüssel aus Werten benötigen, die Datenquelle jedoch nicht vertrauenswürdig ist, können Sie die folgende Methode verwenden:
$reverseMap = [];
foreach ($userInput as $key => $value) {
if (is_scalar($value)) {
$reverseMap[$value][] = $key;
}
}
Auf diese Weise können die Schlüssel, die allen doppelten Werten entsprechen, beibehalten werden:
print_r($reverseMap);
Ausgabe:
Array
(
[admin] => Array ( [0] => user1 [1] => user3 )
[editor] => Array ( [0] => user2 )
)
Array_flip () ist bei der Behandlung von sauberen, gut strukturierten internen Daten sehr nützlich, verwenden Sie diese jedoch mit Vorsicht für Benutzereingaben, es sei denn, Sie können:
Stellen Sie sicher, dass der Wert eindeutig ist
Stellen Sie sicher, dass der Wert eines Skalartyps (Zeichenfolge oder Ganzzahl) ist.
Kennen Sie Ihren Flip -Zweck klar und seien Sie bereit, Ausnahmen zu handhaben
Andernfalls können Sie in einer Ecke stillschweigend Fehler einführen, und bis der Benutzer sich eines Tages über Berechtigungsfehler im Forum beschwert, ist der Schuldige die Linie harmloser Array_flip () .
Ich hoffe, dieser Artikel kann Ihnen helfen, eine versteckte, aber gefährliche Grube zu vermeiden. Wenn Sie eine Funktion des Berechtigungsmanagementsystems oder einer Datenzuordnung entwickeln, können Sie auch Array_flip () vorübergehend herunterlegen und eine robustere Lösung in Betracht ziehen!
Für weitere Studien überprüfen Sie bitte:
? https://m66.net/php-manual/array_flip
? https://m66.net/php-beest-practices
Wenn Sie ähnliche Verwendungsfragen haben, überlassen Sie bitte eine Nachricht, um zu diskutieren. Obwohl die Welt von PHP alt ist, gibt es einen Teufel, der im Detail versteckt ist?