在日常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()是PHP 的一個內置函數,用於將數組的「鍵」和值對調:
array_flip(array $array): array
注意事項:
數組的值必須是唯一且可作為鍵的標量值(如字符串或整數)。
如果有重複值,後面的會覆蓋前面的。
我們來看看如何優雅地反轉一個枚舉值數組:
$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()一步到位?