萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 判斷陣列是否為空:五種方法深度對比與陷阱避坑指南

核心結論先行

推薦使用 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)===0count($arr) === 0true ✓falsefalsefalse極快⭐⭐⭐⭐⭐
$arr === []$arr === []true ✓falsefalsefalse極快⭐⭐⭐⭐
!$arr!$arrtrue ✓falsefalsefalse極快⭐⭐⭐(隱式轉換)
in_array('', $arr)in_array('', $arr)falsetrue ✗falsefalse慢 O(n)❌ 錯誤用法

詳細陷阱分析

1. empty() / count() / === [] / !$arr:語義一致

這四種在「陣列無任何元素」時均返回 true,只要陣列中有 任何元素(哪怕是 null、false、空字符串、空陣列) 都返回 false。這是正確的語義:「容器是否為空」≠「元素值是否為空」。

$a = [];           // true
$b = [''];         // false - 有 1 個元素(空字符串)
$c = [null];       // false - 有 1 個元素
$d = [[], []];     // false - 有 2 個元素(空子陣列)

2. in_array('', $arr) 為什麼錯?

它檢查的是 「值為空字符串的元素是否存在」,而非陣列是否為空。['a','b'] 返回 false,[''] 返回 true,語義完全錯位。

3. implode() 陷阱

$arr = [[], [], []];
$str = implode(',', $arr); // 輸出 ",,"(三個空子陣列轉為空字符串拼接)
echo empty($str) ? '空' : '非空'; // 輸出「非空」❌ 邏輯錯誤

4. foreach 遍歷判斷(多維通用但過度設計)

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;
}
// 僅在需要「遞歸判斷所有葉子節點均為空值」時使用

PHP 版本差異注意

  • PHP 7.2 之前:count(null) 返回 1 並發出 Warning,count(false) 返回 1。
  • PHP 7.2+: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

總結口訣

  1. 看容器大小:empty($arr) / count($arr)===0 / $arr===[]。
  2. 看元素值:那是業務邏輯(如「是否有有效數據」),不要混淆概念。
  3. 多維遞歸:單獨寫函數,不要濫用 implode 或 in_array。
  4. 類型安全:先 is_array() 再判斷,防止標量/對象傳入報錯。
copyright © 萬盛學電腦網 all rights reserved