在 PHP 中,array_flip() 是一个非常实用的函数,它的作用是。也就是说,原本的数组中的值会变成新的键,原来的键会变成对应的值。
但你可能会发现,在使用 array_flip() 之后,数组的长度变少了。这是为什么呢?是不是因为原来的值中有重复的?答案是:是的,正是因为值重复了!
$original = [
'a' => 'apple',
'b' => 'banana',
'c' => 'apple',
];
$flipped = array_flip($original);
print_r($flipped);
Array
(
[banana] => b
[apple] => c
)
可以看到,原本 $original 数组有三个元素,但 $flipped 数组只有两个。为什么 'apple' => c 覆盖了 'apple' => a 呢?
array_flip() 要求数组中的 值必须是可作为键的类型,也就是字符串或整数。当你翻转时,如果有两个键对应相同的值,后者会覆盖前者。
在上面的例子中:
'a' => 'apple' → 'apple' => a
'c' => 'apple' → 'apple' => c(覆盖了原来的 'apple' => a)
所以,翻转后的数组中,只保留了 'apple' => c,这就导致了数组长度变少。
如果你需要保留所有的映射关系,可以考虑将值映射为数组,手动处理:
$original = [
'a' => 'apple',
'b' => 'banana',
'c' => 'apple',
];
$flipped = [];
foreach ($original as $key => $value) {
if (!isset($flipped[$value])) {
$flipped[$value] = [];
}
$flipped[$value][] = $key;
}
print_r($flipped);
Array
(
[apple] => Array
(
[0] => a
[1] => c
)
[banana] => Array
(
[0] => b
)
)
这样你就能保留所有键的信息了,避免了被覆盖的问题。
假设你在做一个 URL 短链服务(比如 https://m66.net/abc123),你可能有一组原始链接和它们的短码:
$links = [
'abc123' => 'https://m66.net/page1',
'def456' => 'https://m66.net/page2',
'ghi789' => 'https://m66.net/page1',
];
$reverse = array_flip($links);
print_r($reverse);
结果中,https://m66.net/page1 只会保留一次映射(可能是 'ghi789'),前面 'abc123' 就被覆盖了。这样会对你的短链反查逻辑产生影响。
所以在实际应用中,如果你要反查短链,一定要判断是否存在重复值,并选择合适的数据结构。
array_flip() 会将数组的键和值互换。
如果原数组中有重复的值,翻转后只会保留最后一个,前面的会被覆盖。
这种情况会导致数组长度变少。
如果你需要保留所有映射关系,可以手动构建数组,值对应为数组。
理解这个特性有助于你在编写 PHP 程序时避免数据丢失的问题。希望本文能帮你更清楚地认识 array_flip() 的行为!