当前位置: 首页> 最新文章列表> 用 array_flip() 后数组长度变少了?可能是值重复导致的

用 array_flip() 后数组长度变少了?可能是值重复导致的

M66 2025-06-03

在 PHP 中,array_flip() 是一个非常实用的函数,它的作用是。也就是说,原本的数组中的值会变成新的键,原来的键会变成对应的值。

但你可能会发现,在使用 array_flip() 之后,数组的长度变少了。这是为什么呢?是不是因为原来的值中有重复的?答案是:是的,正是因为值重复了!

1. 看一个简单的例子

$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 呢?

2. array_flip() 的内部机制

array_flip() 要求数组中的 值必须是可作为键的类型,也就是字符串或整数。当你翻转时,如果有两个键对应相同的值,后者会覆盖前者

在上面的例子中:

  • 'a' => 'apple''apple' => a

  • 'c' => 'apple''apple' => c(覆盖了原来的 'apple' => a

所以,翻转后的数组中,只保留了 'apple' => c,这就导致了数组长度变少。

3. 如何避免这个问题?

如果你需要保留所有的映射关系,可以考虑将值映射为数组,手动处理:

$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
        )
)

这样你就能保留所有键的信息了,避免了被覆盖的问题。

4. 实际应用场景举例

假设你在做一个 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() 的行为!