在PHP 中, array_flip()是一個非常實用的函數。它的作用是交換數組中的鍵與值,即:
array_flip(array $array): array
它會返回一個新數組,將原數組的值作為鍵,原來的鍵作為值。然而,當數組中的值是**資源類型(resource)**時,情況就變得有些微妙了。
在PHP 中,資源( resource )是一種特殊的變量,用於表示外部資源的引用,比如數據庫連接、打開的文件句柄、圖像資源等。例如:
$fp = fopen('http://m66.net/sample.txt', 'r');
var_dump($fp);
// 輸出類似:resource(3) of type (stream)
這並不是字符串、整數、浮點數或數組,而是PHP 內部使用的一種引用類型,不能直接用於大多數需要字符串或數字的上下文中。
當你嘗試對一個包含資源類型值的數組使用array_flip()時,PHP 會試圖將這些值轉換成字符串作為新數組的鍵。然而,資源類型並不能以一種明確且一致的方式轉換為字符串。這就可能引發一些問題。
讓我們看一個實際例子:
$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);
你可能會期望輸出一個鍵為資源、值為原鍵的數組。但實際上, array_flip()會將資源類型轉換為字符串形式的資源ID ,比如"Resource id #3"作為鍵:
Array
(
[Resource id #3] => file1
[Resource id #4] => file2
)
資源ID 是動態分配的,不同請求、不同機器、不同運行時可能得到不同的ID。這意味著翻轉後的數組無法保證一致性,不能用於任何需要確定性鍵的操作,比如緩存或哈希比較。
如果你使用多個資源,但某些資源在字符串轉換後變得一致(雖然罕見),可能會發生鍵衝突, array_flip()只保留最後一個值,其餘會被覆蓋。
array_flip()理論上是可逆的(即對翻轉後的數組再次array_flip()會恢復原狀),但由於資源的字符串表示不具備可還原性,這個過程無法還原為原始的資源變量。
如果你確實需要翻轉數組,確保值是字符串或整數類型。對包含資源的數組,不應直接使用array_flip() 。一種可行的替代方式是,自己構造映射表,例如: