In PHP ist Array_flip () eine sehr praktische Funktion. Seine Funktion besteht darin, Schlüssel und Werte im Array auszutauschen, d. H.:
array_flip(array $array): array
Es gibt ein neues Array zurück und nimmt den Wert des ursprünglichen Arrays als Schlüssel und den ursprünglichen Schlüssel als Wert. Wenn der Wert im Array jedoch der Ressourcentyp ** ist, wird die Situation etwas subtil.
In PHP ist Ressource eine spezielle Variable, mit der Referenzen auf externe Ressourcen wie Datenbankverbindungen, geöffnete Dateihandles, Bildressourcen usw. dargestellt werden. Zum Beispiel:
$fp = fopen('http://m66.net/sample.txt', 'r');
var_dump($fp);
// Der Ausgang ist ähnlich:resource(3) of type (stream)
Dies ist keine String, Ganzzahl, schwimmende Punktnummer oder Array, sondern ein interner Referenztyp, der in PHP verwendet wird und in den meisten Kontexten, in denen Zeichenfolgen oder Zahlen erforderlich sind, nicht direkt verwendet werden kann.
Wenn Sie versuchen , Array_flip () in einem Array mit Ressourcentypwerten zu verwenden, versucht PHP, diese Werte in Zeichenfolgen als Schlüssel in das neue Array umzuwandeln. Ressourcentypen können jedoch nicht explizit und konsistent in Zeichenfolgen umgewandelt werden. Dies kann einige Probleme verursachen.
Schauen wir uns ein praktisches Beispiel an:
$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);
Möglicherweise erwarten Sie, dass Sie ein Array mit Schlüsseln als Ressourcen und Werte als Originalschlüssel ausgeben. Tatsächlich konvertiert array_flip () den Ressourcentyp in Form einer Zeichenfolge in eine Ressourcen -ID , z. B. "Ressourcen -ID #3" als Schlüssel:
Array
(
[Resource id #3] => file1
[Resource id #4] => file2
)
Ressourcen -IDs werden dynamisch zugewiesen, und es können verschiedene IDs aus verschiedenen Anforderungen, verschiedenen Maschinen und verschiedenen Laufzeiten erhalten werden. Dies bedeutet, dass das umgedrehte Array keine Konsistenz garantieren kann und nicht für Operationen verwendet werden kann, die deterministische Schlüssel wie Cache oder Hash -Vergleich erfordern.
Wenn Sie mehrere Ressourcen verwenden, einige Ressourcen jedoch nach der String -Konvertierung (obwohl selten) konsistent werden, können wichtige Konflikte auftreten, Array_flip () behält nur den letzten Wert bei, und der Rest wird überschrieben.
Array_flip () ist theoretisch reversibel (dh Array_flip () wird den ursprünglichen Status für das umgedrehte Array wiederhergestellt), aber da die String -Darstellung der Ressource nicht reduzierbar ist, kann dieser Prozess nicht an die ursprüngliche Ressourcenvariable zurückgeführt werden.
Wenn Sie das Array umdrehen müssen, stellen Sie sicher, dass der Wert eine Zeichenfolge oder eine Ganzzahltyp ist . Für Arrays mit Ressourcen sollte Array_flip () nicht direkt verwendet werden. Eine praktikable Alternative besteht darin, die Zuordnungstabelle selbst zu konstruieren, zum Beispiel: