Dans PHP, array_flip () est une fonction très pratique. Sa fonction est d'échanger des clés et des valeurs dans le tableau, c'est-à-dire:
array_flip(array $array): array
Il renvoie un nouveau tableau, en prenant la valeur du tableau d'origine comme la clé et la clé d'origine comme valeur. Cependant, lorsque la valeur du tableau est le type de ressource **, la situation devient quelque peu subtile.
Dans PHP, la ressource est une variable spéciale utilisée pour représenter des références aux ressources externes, telles que les connexions de base de données, les poignées de fichiers ouvrir, les ressources d'image, etc. par exemple:
$fp = fopen('http://m66.net/sample.txt', 'r');
var_dump($fp);
// La sortie est similaire:resource(3) of type (stream)
Ce n'est pas une chaîne, un entier, un numéro de point flottant ou un tableau, mais un type de référence utilisé en interne en PHP et ne peut pas être utilisé directement dans la plupart des contextes où des chaînes ou des nombres sont nécessaires.
Lorsque vous essayez d'utiliser array_flip () sur un tableau contenant des valeurs de type de ressources, PHP essaie de convertir ces valeurs en chaînes sous forme de touches en nouveau tableau. Cependant, les types de ressources ne peuvent pas être convertis en chaînes d'une manière explicite et cohérente. Cela peut causer certains problèmes.
Regardons un exemple pratique:
$fp1 = fopen('http://m66.net/file1.txt', 'r');
$fp2 = fopen('http://m66.net/file2.txt', 'r');
$arr = [
'file1' => $fp1,
'file2' => $fp2,
];
$flipped = array_flip($arr);
print_r($flipped);
Vous pouvez vous attendre à produire un tableau avec des clés sous forme de ressources et de valeurs sous forme de clés d'origine. Mais en fait, array_flip () , convertira le type de ressource en un ID de ressource sous la forme d'une chaîne , telle que "ID de ressource # 3" comme clé:
Array
(
[Resource id #3] => file1
[Resource id #4] => file2
)
Les ID de ressource sont alloués dynamiquement et différents ID peuvent être obtenus à partir de différentes demandes, différentes machines et différents temps d'exécution. Cela signifie que le tableau inversé ne peut garantir la cohérence et ne peut être utilisé pour les opérations qui nécessitent des clés déterministes, telles que la comparaison de cache ou de hachage.
Si vous utilisez plusieurs ressources, mais que certaines ressources deviennent cohérentes après la conversion des chaînes (bien que rares), des conflits clés peuvent se produire, Array_flip () ne conserve que la dernière valeur et le reste sera écrasé.
Array_flip () est théoriquement réversible (c'est-à-dire que Array_flip () restaurera l'état d'origine pour le tableau inversé), mais comme la représentation de chaîne de la ressource n'est pas réductible, ce processus ne peut pas être restauré à la variable de ressource d'origine.
Si vous avez besoin de retourner le tableau, assurez-vous que la valeur est une chaîne ou un type entier . Pour les tableaux contenant des ressources, array_flip () ne doit pas être utilisé directement. Une alternative viable consiste à construire vous-même la table de cartographie, par exemple: