對空陣列元素??並進行運算,可能觸發 Undefined index 錯誤
$TotalGb = $TotalGroupBrand[$brandNameEn] ?? [];
$quantity = $TotalGb['stock'] ?? 0 + $TotalGb['unshipped_qty'] ?? 0;"
#報錯:Undefined index: unshipped_qty",
程式碼中的錯誤 "Undefined index: unshipped_qty" 是由於 PHP 的 ?? 空合併運算子沒有對陣列鍵的存在性進行深層次處理,在巢狀訪問時仍然可能觸發 Undefined index 錯誤。
以下是問題的具體原因和解決辦法:
問題分析
程式碼中的 $TotalGb['unshipped_qty'] ?? 0 雖然能處理鍵不存在的情況,但在 PHP 中訪問一個不存在的陣列鍵時會先嚐試訪問該鍵,從而丟擲 Undefined index 錯誤。
解決方案
1、逐步檢查鍵是否存在: 透過 isset() 先檢查鍵是否存在,然後進行運算,確保安全訪問:
$TotalGb = $TotalGroupBrand[$brandNameEn] ?? [];
$stock = isset($TotalGb['stock']) ? $TotalGb['stock'] : 0;
$unshippedQty = isset($TotalGb['unshipped_qty']) ? $TotalGb['unshipped_qty'] : 0;
$quantity = $stock + $unshippedQty;
2、利用 array_key_exists() 檢查鍵: 如果陣列可能包含 null 值並且你需要嚴格區分鍵不存在和值為 null 的情況,可以用 array_key_exists():
$stock = array_key_exists('stock', $TotalGb) ? $TotalGb['stock'] : 0;
$unshippedQty = array_key_exists('unshipped_qty', $TotalGb) ? $TotalGb['unshipped_qty'] : 0;
$quantity = $stock + $unshippedQty;
3、重構運算邏輯: 使用 array_reduce() 等函式對陣列的鍵值進行統一處理,避免直接訪問:
$quantity = ($TotalGb['stock'] ?? 0) + ($TotalGb['unshipped_qty'] ?? 0);
4、PHP 8+ 的 null 安全運算子(推薦): 如果你的 PHP 版本是 8.0 或更高,可以使用 ?? 和 null 安全運算子 ?->,安全地訪問深層次的鍵值:
$quantity = ($TotalGroupBrand[$brandNameEn]['stock'] ?? 0) + ($TotalGroupBrand[$brandNameEn]['unshipped_qty'] ?? 0);
5、推薦程式碼(綜合方案):
如果你希望程式碼簡潔,且不依賴特定的 PHP 版本,可以這樣寫:
$TotalGb = $TotalGroupBrand[$brandNameEn] ?? [];
$quantity = ($TotalGb['stock'] ?? 0) + ($TotalGb['unshipped_qty'] ?? 0);
這樣可以避免直接訪問導致的未定義索引錯誤,同時保持可讀性和簡潔性。