In PHP wird die Funktion array_flip () verwendet, um Schlüssel und Werte eines Arrays auszutauschen, das alle Schlüssel im Array als Werte, Werte als Schlüssel und ein neues Array zurückgibt. Für normale Array -Werte wird Array_flip () sehr reibungslos ausgeführt. Es kann jedoch eine eingehende Diskussion darüber erforderlich sein, wie diese Funktion das Problem von Objekten als Werte in einem assoziativen Array umgeht.
Schauen wir uns zunächst die grundlegende Verwendung von Array_flip () an. Angenommen, wir haben ein einfaches assoziatives Array, der Code ist wie folgt:
$array = [
"a" => "apple",
"b" => "banana",
"c" => "cherry"
];
$flipped = array_flip($array);
print_r($flipped);
Die Ausgabe wird sein:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Wie oben gezeigt, wandelt Array_flip () den Wert des Arrays in einen Schlüssel um, und der ursprüngliche Schlüssel wird zum Wert. Dieser Vorgang ist sehr direkt und funktioniert bei grundlegenden Datentypen (z. B. Zeichenfolgen, Ganzzahlen usw.).
Wenn der Wert im Array ein Objekt ist, ist das Verhalten von array_flip () nicht so einfach. Schauen wir uns den folgenden Code an:
class Fruit {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$array = [
"a" => new Fruit("apple"),
"b" => new Fruit("banana"),
"c" => new Fruit("cherry")
];
$flipped = array_flip($array);
print_r($flipped);
Sie könnten erwarten, dass die Ausgabe lautet:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Das tatsächliche Ergebnis ist jedoch nicht. PHP stößt auf ein Problem, wenn Sie versuchen, ein Objekt als Wert an Array_flip () zu übergeben, da das Objekt nicht als Schlüssel für ein Array verwendet werden kann. PHP wird versuchen, ein Objekt in eine Zeichenfolge als neue Schlüssel zu konvertieren, aber standardmäßig wird das Objekt durch seinen Klassennamen und eine interne eindeutige Kennung dargestellt (z. B. Frucht Nr. 1 ).
Daher kann die Ausgabe des obigen Codes sein:
Array
(
[Fruit#1] => a
[Fruit#2] => b
[Fruit#3] => c
)
Dies zeigt, dass Array_flip () Objektwerte nicht direkt in Schlüsseln umwandeln können, da der Vergleich von Objekten auf ihren Instanzbezeichnern und nicht auf ihrem Inhalt basiert.
Objekte in PHP werden mit Referenz übergeben, anstatt direkt wie primitive Datentypen kopiert zu werden. Objektvergleiche basieren auf In-Memory-Referenzen, nicht auf ihren Eigenschaften oder Werten. Wenn also Array_flip () versucht, Objekte als Schlüssel für ein Array zu verwenden, befasst es sich tatsächlich mit Verweise auf Objekte, nicht mit ihrem Inhalt.
Da die Identifikatoren von Objekten dynamisch sind, kann PHP sie nicht direkt in gültige Schlüssel umwandeln. Gültige Arrayschlüssel müssen vom Skalartyp wie Ganzzahlen oder Zeichenfolgen sein, und Objektreferenzen erfüllen diesen Zustand nicht.
Wenn Sie die Objektwerte in einem Array wirklich tauschen müssen, können Sie die folgende Lösung berücksichtigen:
Konvertieren Sie ein Objekt in eine Zeichenfolge : Konvertieren Sie ein Objekt in eine Zeichenfolge, indem Sie die Methode __toString () implementieren. Auf diese Weise kann Array_flip () diese Zeichenfolgenwerte als neue Schlüssel verwenden.
class Fruit {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __toString() {
return $this->name;
}
}
$array = [
"a" => new Fruit("apple"),
"b" => new Fruit("banana"),
"c" => new Fruit("cherry")
];
$flipped = array_flip($array);
print_r($flipped);
Die Ausgabe wird sein:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Verwenden Sie die Eigenschaften eines Objekts : Wenn das Objekt verfügbare Eigenschaften enthält, können Sie diese Eigenschaften auch als Schlüssel verwenden. Durch Extrahieren der Eigenschaften des Objekts, wandeln Sie es in ein Array und unter Verwendung von Array_flip () .
$array = [
"a" => new Fruit("apple"),
"b" => new Fruit("banana"),
"c" => new Fruit("cherry")
];
$processedArray = [];
foreach ($array as $key => $fruit) {
$processedArray[$fruit->name] = $key;
}
print_r($processedArray);
Die Ausgabe ist gleich:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Die Funktion array_flip () verarbeitet Objekte nicht korrekt als Werte und konvertiert sie für Arrays in Schlüssel. Wenn Sie sich mit Objektwerten befassen müssen, können Sie in Betracht ziehen , die Methode __toString () zu verwenden, um das Objekt in eine Zeichenfolge umzuwandeln oder die Eigenschaften des Objekts als Schlüssel zu verwenden.