在 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()。一种可行的替代方式是,自己构造映射表,例如: