當前位置: 首頁> 最新文章列表> 用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()的行為!