當前位置: 首頁> 最新文章列表> 如何使用array_flip() 優雅地反轉枚舉值數組

如何使用array_flip() 優雅地反轉枚舉值數組

M66 2025-06-03

在日常PHP 開發中,我們經常會遇到「枚舉值? 標籤」之間的相互轉換。比如,一個訂單狀態的數組:

 $statusMap = [
    0 => '待支付',
    1 => '已支付',
    2 => '已發貨',
    3 => '已完成',
];

這種結構便於從狀態碼取出對應的文字描述。但有時候我們也需要反過來操作,比如根據“已發貨”取出其對應的狀態碼2 。這時,如果沒有額外的結構支持,可能需要遍歷整個數組,寫出類似的邏輯:

 function getStatusCode($label) {
    foreach ($statusMap as $code => $desc) {
        if ($desc === $label) {
            return $code;
        }
    }
    return null;
}

看起來就有些囉嗦了。這時候,PHP 自帶的array_flip()函數就派上用場了!

什麼是array_flip()

array_flip()是PHP 的一個內置函數,用於將數組的「鍵」和值對調:

 array_flip(array $array): array

注意事項:

  • 數組的值必須是唯一且可作為鍵的標量值(如字符串或整數)。

  • 如果有重複值,後面的會覆蓋前面的。

array_flip()實現枚舉值反轉

我們來看看如何優雅地反轉一個枚舉值數組:

 $statusMap = [
    0 => '待支付',
    1 => '已支付',
    2 => '已發貨',
    3 => '已完成',
];

$labelToCodeMap = array_flip($statusMap);

echo $labelToCodeMap['已發貨']; // 輸出 2

是不是瞬間簡潔了不少?只需要一次array_flip() ,就獲得了從“標籤”到“值”的映射表。

實戰案例:表單下拉選項值轉換

假設你有一個用戶性別選項的枚舉:

 $genderMap = [
    'M' => '男',
    'F' => '女',
    'O' => '其他',
];

表單提交時用戶選擇的是'女' ,你希望將其轉換回'F'儲存到數據庫中:

 $input = '女';
$labelToValue = array_flip($genderMap);
$genderCode = $labelToValue[$input] ?? null;

if ($genderCode === null) {
    echo "非法性別值";
} else {
    // 假設這裡保存到數據庫
    saveGenderToDB($genderCode);
}

不僅代碼更加緊湊,而且邏輯非常清晰易懂。

使用技巧:緩存反轉數組

如果在多個地方都需要使用反轉數組,不妨在項目中定義一個通用方法:

 function getFlippedMap(array $map): array {
    static $cache = [];

    $hash = md5(json_encode($map));
    if (!isset($cache[$hash])) {
        $cache[$hash] = array_flip($map);
    }

    return $cache[$hash];
}

這樣,即便多次調用,也能複用已有的反轉結果,提升性能。

注意事項:值必須唯一

要記住,如果原數組中的值不唯一, array_flip()將會自動覆蓋之前的鍵:

 $arr = [
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'apple',
];

print_r(array_flip($arr));

輸出將是:

 Array
(
    [banana] => b
    [apple] => c // 'a' 被覆蓋
)

這在處理枚舉值時可能引發bug,因此建議在反轉前確保值是唯一的。

小結

array_flip()是一個小巧卻非常實用的函數,尤其適用於“標籤? 值”之間的快速轉換。通過它,我們可以讓PHP 代碼更簡潔、更易讀,也更少出錯。下次當你寫下一個循環時,不妨想想:這是不是可以用array_flip()一步到位?