Dans PHP, la fonction array_flip () est utilisée pour échanger des clés et des valeurs d'un tableau, qui prend toutes les clés du tableau sous forme de valeurs, de valeurs sous forme de clés et renvoie un nouveau tableau. Pour les valeurs normales du tableau, array_flip () s'exécute très en douceur. Cependant, une discussion approfondie peut être nécessaire sur la façon dont cette fonction gère la question des objets comme valeurs dans un tableau associatif.
Tout d'abord, regardons l'utilisation de base de array_flip () . Supposons que nous ayons un tableau associatif simple, le code est le suivant:
$array = [
"a" => "apple",
"b" => "banana",
"c" => "cherry"
];
$flipped = array_flip($array);
print_r($flipped);
La sortie sera:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Comme indiqué ci-dessus, array_flip () convertit la valeur du tableau en une clé, et la clé d'origine devient une valeur. Cette opération est très directe et fonctionne très bien sur les types de données de base (tels que les chaînes, les entiers, etc.).
Lorsque la valeur dans le tableau est un objet, le comportement de array_flip () n'est pas si simple. Jetons un coup d'œil au code suivant:
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);
Vous pourriez vous attendre à ce que la sortie soit:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Cependant, le résultat réel n'est pas. PHP rencontre un problème lorsque vous essayez de passer un objet en tant que valeur à array_flip () car l'objet ne peut pas être utilisé comme clé d'un tableau. PHP essaiera de convertir un objet en une chaîne en tant que nouvelle clé, mais par défaut, l'objet est représenté par son nom de classe et un identifiant unique interne (par exemple, Fruit # 1 ).
Par conséquent, la sortie du code ci-dessus pourrait être:
Array
(
[Fruit#1] => a
[Fruit#2] => b
[Fruit#3] => c
)
Cela montre que Array_flip () ne peut pas convertir les valeurs d'objets directement en touches, car la comparaison des objets est basée sur leurs identifiants d'instance, pas leur contenu.
Les objets en PHP sont passés par référence, plutôt que d'être copiés directement comme des types de données primitifs. Les comparaisons d'objets sont basées sur des références en mémoire, pas leurs propriétés ou leurs valeurs. Ainsi, lorsque Array_flip () essaie d'utiliser des objets comme des clés d'un tableau, il traite en fait des références aux objets, pas à leur contenu.
De plus, comme les identifiants des objets sont dynamiques, PHP ne peut pas les convertir directement en clés valides. Les clés de tableau valides doivent être de type scalaire, telles que des entiers ou des chaînes, et les références d'objets ne satisfont pas à cette condition.
Si vous avez vraiment besoin d'échanger des valeurs d'objets dans un tableau, vous pouvez considérer la solution suivante:
Convertissez un objet en une chaîne : convertissez un objet en une chaîne en implémentant la méthode __toString () . Cela permet à array_flip () d'utiliser ces valeurs de chaîne comme nouvelles clés.
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);
La sortie sera:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
Utilisez les propriétés d'un objet : Si l'objet contient des propriétés disponibles, vous pouvez également utiliser ces propriétés comme clés. En extraite les propriétés de l'objet, en la convertissant en un tableau, puis en utilisant 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);
La sortie est la même:
Array
(
[apple] => a
[banana] => b
[cherry] => c
)
La fonction array_flip () ne traite pas correctement les objets sous forme de valeurs et les convertit en clés pour les tableaux. Si vous devez gérer les valeurs des objets, vous pouvez envisager d'utiliser la méthode __toString () pour convertir l'objet en chaîne ou en utilisant les propriétés de l'objet comme clés.