網頁

2013年11月12日

[php] 陣列為空值使用isset無法正常判斷問題

這個問題是在做資料批次處理時所遇到的,條件是資料庫有資料時,就使用更新(Update)的方式,不然就使用新增(Insert)方式。

為了降低資料庫Loading,此次採用先將資料全部取出存入陣列,再從陣列值判斷採用更新(Update)或是新增(Insert)的方式。

//SQL.......略
while (list($key, $value) = $stmt->fetch()) {
    $r[$key] = $value;
}

從資料庫讀取到陣列後,陣列大約是長這樣。
Array
(
    [A01] =>
    [A02] => 我有值
    ........
    ..........略
)

看到有空值出現,當下就直接使用isset函數做判斷,但事實跟想法不同,遇到陣列為空值時,照理說應該是採用更新的方式,但實際卻做了新增資料。

if (isset($r["A01"])){
    ......資料更新......
}else{
    ......資料新增......
}

試了幾次都不能正常運作時,這時也沒再多做嘗試,直接到php手冊仔細看一下說明,說明開頭就寫isset是「檢測變量是否設置,並且不是NULL。」,看到"NULL"字樣,馬上就明白是怎麼一回事,接下來說明原因。

將陣列內容使用var_dump函數顯示出來。

var_dump($r);

array(2) {
  ["A01"]=>
  NULL
  ["A02"]=>
  string(9) "我有值"
}

果然鍵值"A01"是NULL,難怪isset沒辦法判斷,當下就放棄使用值(VALUE)來判斷,要使用鍵(KEY)做判斷。

if (array_key_exists("A01", $r)){
    ......資料更新......
}else{
    ......資料新增......
}

若是多維陣列,也可以使用array_keys配合in_array做判斷處理。
if (in_array("A01", array_keys($r))){
    ......資料更新......
}else{
    ......資料新增......
}

注意事項:
所謂的NULL指的是不存在任何屬性("\0"),一般常量宣告的空值「$r=""」不是NULL。