PHP 以開發效率高著稱,但這往往以犧牲執行效率為代價。PHP 的陣列功能極其強大,但在使用時仍需謹慎考量各種邊界情況。本文將分享兩個實戰中常見的「坑」,幫助開發者避開隱患。
foreach 提供了遍歷陣列的便捷方式,但官方文檔明確警告:由於 foreach 依賴內部陣列指針,在循環中修改值可能導致意外行為。核心守則如下:
unset() 銷毀引用變量。否則,後續代碼若重用該變量名,將導致最後一個元素的值被意外修改,例如列表輸出時最後一行出現亂碼或空值。<?php
$a = [1, 2, 3, 17];
// ❌ 錯誤:直接輸出陣列變數而非元素
foreach ($a as $v) {
echo "Current value of ".$a.":". $v."<br />"; // $a 會被轉為字串 "Array"
}
// ✅ 正確:僅讀取值
foreach ($a as $v) {
echo "Current value: $v<br />";
}
// ✅ 需修改時:使用引用並及時 unset
foreach ($a as &$v) {
$v *= 2;
}
unset($v); // 關鍵步驟!
in_array($needle, $haystack) 用於檢查值是否存在於陣列中。但當 $haystack 為純整數陣列(如 [0,1,2,3])時,PHP 會將字串型的 $needle 執行 intval() 轉換,導致所有非數字字串均轉為 0。若陣列中恰好包含 0,則會誤判為存在。
$stack = [[0, 1], [2, 3]];
$keyWord = "abc"; // 非數字字串
// 危險:in_array 會將 "abc" 轉為 0,匹配到 $stack[0][0] 即 0
foreach ($stack as $key => $val) {
if (in_array($keyWord, $val)) { // 返回 true,實為誤判
return TRUE;
}
}
in_array($needle, $haystack, true) 啟用嚴格類型比較;array_flip() 將值轉為鍵,再用 isset() 或 array_key_exists() 判斷,效率更高且避免類型轉換。PHP 容錯性極強,當字串被以陣列方式訪問(如 $str[0])時,會自動將下標轉為整數 0,返回首字元。這在動態類型變量中極易產生邏輯錯誤。防範措施:在下標訪問前,務必用 is_array() 驗證變量類型。
前輩們雖屢次踩坑並總結經驗,但「爛代碼」仍層出不窮。養成嚴謹的類型檢查習慣、善用嚴格比較、及時銷毀引用,才能在 PHP 的靈活性與安全性間取得平衡。