判断php多维数组是否“不为空”,需明确语义:完全无元素,或存在任意非空值;推荐递归array_filter过滤后判空,或根据业务需求定制逻辑(如保留0/''/false),避免仅用empty()、count()等顶层判断。

判断 PHP 多维数组是否“不为空”,关键不是只看 empty() 或 count(),而是要明确你关心的“空”是指:完全没有任何元素(包括所有嵌套层级),还是只要存在任意一个非空值(字符串、数字、true、非空子数组等)就算“不为空”。
用 array_filter() 递归去除非空值再判空
这是最常用也最可靠的方式:把整个多维数组“扁平化过滤”,去掉所有等价于 false 的值(null、0、''、false、[]),再判断结果是否为空。
你可以写一个递归函数:
function isNotEmptyArray($arr) {
if (!is_array($arr)) return !empty($arr);
$filtered = array_filter($arr, function($v) {
return isNotEmptyArray($v);
});
return !empty($filtered);
}
// 使用示例
var_dump(isNotEmptyArray([])); // false
var_dump(isNotEmptyArray([[], []])); // false
var_dump(isNotEmptyArray([['a' => 1], []])); // true
var_dump(isNotEmptyArray([0, '', null, []])); // false(这些都被 array_filter 当作 false 过滤掉)
只关心“是否有任意子数组含真实数据”,忽略 0/''/false
如果业务中 0、''、false 是合法有效值(比如表单提交了数字 0),那不能用默认 array_filter() —— 它会误删。此时应显式检查「是否存在非数组且非空」或「是否存在非空子数组」:
- 遍历每一项,遇到
is_array($v)就递归检查; - 遇到非数组,用
!is_null($v) || $v === 0 || $v === false || $v === ''等逻辑判断是否算“有值”; - 一旦发现一项满足条件,立即返回
true。
简化版(认为 0、false、'' 都算“有内容”):
function hasContent($arr) {
if (!is_array($arr)) return true;
foreach ($arr as $v) {
if (is_array($v)) {
if (hasContent($v)) return true;
} else {
return true; // 非数组即视为有内容(包括 0、''、false)
}
}
return false;
}
用 json_encode() 快速粗筛(仅限简单场景)
对结构较规范、不含资源/对象/循环引用的数组,可借助 json_encode($arr) !== '[]' 判断。因为 PHP 空数组编码为 [],而多维空数组如 [[],[]] 编码后是 [[],[]],显然不等于 [],所以它能识别“非完全空”。但注意:
- 它无法区分
[0]和[[]](都非[]); - 含
null或不可序列化内容会失败; - 性能略低,仅适合小数组或临时调试。
别踩坑:这些判断方式容易出错
empty($arr):只判断顶层是否为空,[[],[]] 返回 true,但其实它有两个空子数组——你可能认为“有结构”就不算空。
count($arr) > 0:同样只看顶层长度,[[],[]] 返回 2,但若你关心的是“有没有实际数据”,这就不准。
array_reduce($arr, 'count', 0) > 0:错误!count([]) 是 0,但 count([[]]) 是 1(子数组本身算一个元素),不是子数组里的元素个数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











