推薦使用
empty($arr)或count($arr) === 0(PHP 7.2+ 建議count($arr) === 0避免警告)。嚴禁用in_array('', $arr)、strlen(implode(...))等副作用方法。
| 方法 | 代碼 | 空陣列 [] | 含空字符串 [''] | 含 null [null] | 多維空陣列 [[],[]] | 速度 | 推薦度 |
|---|---|---|---|---|---|---|---|
empty($arr) | empty($arr) | true ✓ | false(非空) | false(非空) | false(非空) | 極快 | ⭐⭐⭐⭐⭐ |
count($arr)===0 | count($arr) === 0 | true ✓ | false | false | false | 極快 | ⭐⭐⭐⭐⭐ |
$arr === [] | $arr === [] | true ✓ | false | false | false | 極快 | ⭐⭐⭐⭐ |
!$arr | !$arr | true ✓ | false | false | false | 極快 | ⭐⭐⭐(隱式轉換) |
in_array('', $arr) | in_array('', $arr) | false | true ✗ | false | false | 慢 O(n) | ❌ 錯誤用法 |
這四種在「陣列無任何元素」時均返回 true,只要陣列中有 任何元素(哪怕是 null、false、空字符串、空陣列) 都返回 false。這是正確的語義:「容器是否為空」≠「元素值是否為空」。
$a = []; // true
$b = ['']; // false - 有 1 個元素(空字符串)
$c = [null]; // false - 有 1 個元素
$d = [[], []]; // false - 有 2 個元素(空子陣列)
它檢查的是 「值為空字符串的元素是否存在」,而非陣列是否為空。['a','b'] 返回 false,[''] 返回 true,語義完全錯位。
$arr = [[], [], []];
$str = implode(',', $arr); // 輸出 ",,"(三個空子陣列轉為空字符串拼接)
echo empty($str) ? '空' : '非空'; // 輸出「非空」❌ 邏輯錯誤
function isDeepEmpty(array $arr): bool {
foreach ($arr as $v) {
if (is_array($v)) {
if (!isDeepEmpty($v)) return false;
} elseif ($v !== null && $v !== '' && $v !== false) {
return false; // 發現非空標量值
}
}
return true;
}
// 僅在需要「遞歸判斷所有葉子節點均為空值」時使用
count(null) 返回 1 並發出 Warning,count(false) 返回 1。count() 參數非 Countable/陣列拋出 TypeError。empty() 最安全,或先 is_array($arr) && count($arr) === 0。<?php
/** 判斷陣列是否為空(無任何元素) */
function is_array_empty(mixed $var): bool {
return is_array($var) && empty($var);
}
/** 判斷陣列是否「實質為空」(遞歸:所有葉子節點均為空值) */
function is_array_deep_empty(array $arr): bool {
foreach ($arr as $v) {
if (is_array($v)) {
if (!is_array_deep_empty($v)) return false;
} elseif (!empty($v) || is_numeric($v)) { // 0 視為非空
return false;
}
}
return true;
}
// 測試
var_dump(is_array_empty([])); // true
var_dump(is_array_empty([''])); // false
var_dump(is_array_deep_empty([[''],[null]])); // true
empty($arr) / count($arr)===0 / $arr===[]。implode 或 in_array。is_array() 再判斷,防止標量/對象傳入報錯。