在PHP开发过程中,判断数组是否包含有效值是高频操作,empty和isset是最常被用到的两个函数,但不少开发者对它们的适用场景存在混淆,甚至会在逻辑判断中出现错误。下面先介绍两个函数的基础特性,再结合数组场景做具体分析。

empty和isset的基础定义
empty是语言结构,用来判断一个变量是否为空,当变量不存在、值为false、0、空字符串、空数组、null等情况时,empty都会返回true。isset同样是语言结构,用来判断一个变量是否已经设置并且不是null,只要变量存在且值不为null,就会返回true。
针对数组的判断差异
判断整个数组是否有值
当需要判断整个数组是否包含元素时,两个函数的表现有明显区别:
- 如果数组变量未定义,empty返回true,isset返回false
- 如果数组变量已定义但为空数组
array(),empty返回true,isset返回true - 如果数组变量已定义且包含元素,empty返回false,isset返回true
来看一段实际代码示例:
<?php // 未定义数组的情况 var_dump(empty($undefinedArr)); // 输出 bool(true) var_dump(isset($undefinedArr)); // 输出 bool(false) // 空数组的情况 $emptyArr = array(); var_dump(empty($emptyArr)); // 输出 bool(true) var_dump(isset($emptyArr)); // 输出 bool(true) // 有值的数组 $hasValueArr = array(1, 2, 3); var_dump(empty($hasValueArr)); // 输出 bool(false) var_dump(isset($hasValueArr)); // 输出 bool(true) ?>
判断数组指定键是否有值
如果我们需要判断数组中某个具体的键是否存在且有值,两个函数的差异会更明显:
- empty判断的是该键对应的值是否为空,不管键是否存在,只要值符合空的定义就返回true
- isset判断的是该键是否存在且对应的值不为null,不关心值是否为其他空值
对应的代码示例如下:
<?php
$testArr = array(
'name' => '张三',
'age' => 0,
'score' => null,
'hobby' => ''
);
// 判断键name
var_dump(empty($testArr['name'])); // 输出 bool(false),因为值不为空
var_dump(isset($testArr['name'])); // 输出 bool(true),键存在且值不为null
// 判断键age
var_dump(empty($testArr['age'])); // 输出 bool(true),0属于空值
var_dump(isset($testArr['age'])); // 输出 bool(true),键存在且值不为null
// 判断键score
var_dump(empty($testArr['score'])); // 输出 bool(true),值为null属于空值
var_dump(isset($testArr['score'])); // 输出 bool(false),值为null
// 判断不存在的键city
var_dump(empty($testArr['city'])); // 输出 bool(true),键不存在属于空
var_dump(isset($testArr['city'])); // 输出 bool(false),键不存在
?>
如何选择使用empty还是isset
根据实际需求选择即可:
- 如果需要判断数组整体或者某个键对应的值是否为有效非空值,比如判断用户提交的表单数组是否有内容,优先使用empty,避免空数组、0、空字符串等无效值通过判断
- 如果只需要判断数组变量是否存在、或者某个键是否在数组中存在且值不为null,不需要关心值是否为其他空值,优先使用isset,比如判断配置数组中某个配置项是否设置
其他判断数组有值的方法
除了empty和isset,还可以用count()函数判断数组元素个数,当count($arr) > 0时说明数组有值,这种方式比empty更明确,只会判断数组元素数量,不会受到数组值类型的影响。另外array_filter()函数可以过滤数组中的空值,再用count判断过滤后的数组长度,能更精准地判断数组中是否有有效非空元素。
<?php $arr1 = array(0, '', null); $arr2 = array(1, 2, 3); // 用count判断 var_dump(count($arr1) > 0); // 输出 bool(true),因为有三个元素 var_dump(count($arr2) > 0); // 输出 bool(true) // 用array_filter过滤后判断 var_dump(count(array_filter($arr1)) > 0); // 输出 bool(false),过滤后为空数组 var_dump(count(array_filter($arr2)) > 0); // 输出 bool(true) ?>