如果您只需要检查数组中是否有任何元素,则可以使用数组本身,因为 PHP 的类型很松散,或者 - 如果您更喜欢更严格的方法 - 使用 count()
:
if (!$playerlist) {
// list is empty.
}
if (count($playerlist) === 0) {
// list is empty.
}
如果您需要在检查前清除空值(通常这样做是为了防止explode
奇怪的字符串):
foreach ($playerlist as $key => $value) {
if (!strlen($value)) {
unset($playerlist[$key]);
}
}
if (!$playerlist) {
//empty array
}
空数组在 PHP 中是错误的,因此您甚至不需要像其他人建议的那样使用 empty()
。
<?php
$playerList = array();
if (!$playerList) {
echo "No players";
} else {
echo "Explode stuff...";
}
// Output is: No players
PHP 的 empty()
确定变量是否不存在或具有虚假值(如 array()
、0
、null
、false
等)。
在大多数情况下,您只想检查 !$emptyVar
。如果变量可能尚未设置并且您不想触发 E_NOTICE
,请使用 empty($emptyVar)
; IMO 这通常是一个坏主意。
一些不错的答案,但只是想我会扩展一点,以便在 PHP 确定数组是否为空时更清楚地解释。
主要说明:
PHP 将确定带有一个键(或多个键)的数组不为空。
由于数组值需要存在键,因此数组中是否存在值并不能确定它是否为空,只有在没有键的情况下(因此没有值)。
因此,使用 empty()
检查数组并不仅仅告诉您是否有值,它会告诉您数组是否为空,并且键是数组的一部分。
因此,在决定使用哪种检查方法之前,请考虑如何生成数组。
EG 当用户提交 HTML 表单时,数组将有键,而每个表单字段都有一个数组名称(即 { 1}).
将为每个字段生成一个 非空 数组,因为每个表单字段的数组都有自动递增的键值。
以这些数组为例:
/* Assigning some arrays */
// Array with user defined key and value
$ArrayOne = array("UserKeyA" => "UserValueA", "UserKeyB" => "UserValueB");
// Array with auto increment key and user defined value
// as a form field would return with user input
$ArrayTwo[] = "UserValue01";
$ArrayTwo[] = "UserValue02";
// Array with auto incremented key and no value
// as a form field would return without user input
$ArrayThree[] = '';
$ArrayThree[] = '';
如果您回显上述数组的数组键和值,您会得到以下信息:
数组一:[UserKeyA] => [UserValueA] [UserKeyB] => [UserValueB] 数组二:[0] => [UserValue01] [1] => [UserValue02] 第三数组:[0] => [] [1 ] => []
使用 empty()
测试上述数组会返回以下结果:
数组一:$ArrayOne 不为空数组二:$ArrayTwo 不为空数组三:$ArrayThree 不为空
当您分配一个数组但此后不再使用它时,数组将始终为空,例如:
$ArrayFour = array();
这将为空,即在上面使用 if empty()
时 PHP 将返回 TRUE。
因此,如果您的数组有键 - 例如通过表单的输入名称或手动分配它们(即创建一个以数据库列名作为键但没有来自数据库的值/数据的数组),那么该数组将不是 {1 }。
在这种情况下,您可以在 foreach 中循环数组,测试每个键是否有值。如果您无论如何都需要遍历数组,这是一个很好的方法,也许是检查键或清理数据。
但是,如果您只需要知道“值是否存在”返回 TRUE 或 FALSE,这不是最好的方法。当知道数组有键时,有多种方法可以确定数组是否有任何值。函数或类可能是最好的方法,但一如既往,它取决于您的环境和确切要求,以及其他事情,例如您当前对数组所做的事情(如果有的话)。
这是一种使用非常少的代码来检查数组是否具有值的方法:
使用 array_filter()
:
遍历数组中的每个值,将它们传递给回调函数。如果回调函数返回 true,则将数组中的当前值返回到结果数组中。数组键被保留。
$EmptyTestArray = array_filter($ArrayOne);
if (!empty($EmptyTestArray))
{
// do some tests on the values in $ArrayOne
}
else
{
// Likely not to need an else,
// but could return message to user "you entered nothing" etc etc
}
在所有三个示例数组(在此答案的第一个代码块中创建)上运行 array_filter()
会产生以下结果:
数组一:$arrayone 不为空数组二:$arraytwo 不为空数组三:$arraythree 为空
所以当没有值的时候,不管有没有key,使用array_filter()
新建一个数组,然后检查新数组是否为空,显示原数组中是否有值。
不理想并且有点混乱,但是如果您有一个巨大的数组并且由于任何其他原因不需要循环遍历它,那么就所需的代码而言,这是最简单的。
我在检查开销方面没有经验,但最好了解使用 array_filter()
和 foreach
检查是否找到值之间的区别。
显然,基准测试需要针对各种参数,小型和大型数组以及是否有值等。
array_filter()
解决我的问题
count(array())==0
在有键但没有值时为假,因此这无助于仅检查值。您的陈述是正确的,但是您正在强制使用 count(array())
进行测试,因为数组当然是空的。我们需要检查数组何时从表单或其他地方返回,以了解它是空的(键/值)还是只有值
array_filter($_FILES["documento"]['name'])
我运行了包含在帖子末尾的基准测试。比较方法:
计数($arr)== 0:计数
空($arr):空
$arr == [] : 补偿
(bool) $arr : 演员表
并得到以下结果
Contents \method | count | empty | comp | cast |
------------------|--------------|--------------|--------------|--------------|
Empty |/* 1.213138 */|/* 1.070011 */|/* 1.628529 */| 1.051795 |
Uniform |/* 1.206680 */| 1.047339 |/* 1.498836 */|/* 1.052737 */|
Integer |/* 1.209668 */|/* 1.079858 */|/* 1.486134 */| 1.051138 |
String |/* 1.242137 */| 1.049148 |/* 1.630259 */|/* 1.056610 */|
Mixed |/* 1.229072 */|/* 1.068569 */|/* 1.473339 */| 1.064111 |
Associative |/* 1.206311 */| 1.053642 |/* 1.480637 */|/* 1.137740 */|
------------------|--------------|--------------|--------------|--------------|
Total |/* 7.307005 */| 6.368568 |/* 9.197733 */|/* 6.414131 */|
空和转换为布尔值之间的区别是微不足道的。我已经多次运行这个测试,它们看起来基本上是等价的。数组的内容似乎没有发挥重要作用。两者产生相反的结果,但逻辑上的否定几乎不足以在大多数情况下推动选角获胜,所以我个人更喜欢空的,以方便阅读。
#!/usr/bin/php
<?php
// 012345678
$nt = 90000000;
$arr0 = [];
$arr1 = [];
$arr2 = [];
$arr3 = [];
$arr4 = [];
$arr5 = [];
for ($i = 0; $i < 500000; $i++) {
$arr1[] = 0;
$arr2[] = $i;
$arr3[] = md5($i);
$arr4[] = $i % 2 ? $i : md5($i);
$arr5[md5($i)] = $i;
}
$t00 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr0) == 0;
}
$t01 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr0);
}
$t02 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr0 == [];
}
$t03 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr0;
}
$t04 = microtime(true);
$t10 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr1) == 0;
}
$t11 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr1);
}
$t12 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr1 == [];
}
$t13 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr1;
}
$t14 = microtime(true);
/* ------------------------------ */
$t20 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr2) == 0;
}
$t21 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr2);
}
$t22 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr2 == [];
}
$t23 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr2;
}
$t24 = microtime(true);
/* ------------------------------ */
$t30 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr3) == 0;
}
$t31 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr3);
}
$t32 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr3 == [];
}
$t33 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr3;
}
$t34 = microtime(true);
/* ------------------------------ */
$t40 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr4) == 0;
}
$t41 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr4);
}
$t42 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr4 == [];
}
$t43 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr4;
}
$t44 = microtime(true);
/* ----------------------------------- */
$t50 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
count($arr5) == 0;
}
$t51 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
empty($arr5);
}
$t52 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
$arr5 == [];
}
$t53 = microtime(true);
for ($i = 0; $i < $nt; $i++) {
(bool) $arr5;
}
$t54 = microtime(true);
/* ----------------------------------- */
$t60 = $t00 + $t10 + $t20 + $t30 + $t40 + $t50;
$t61 = $t01 + $t11 + $t21 + $t31 + $t41 + $t51;
$t62 = $t02 + $t12 + $t22 + $t32 + $t42 + $t52;
$t63 = $t03 + $t13 + $t23 + $t33 + $t43 + $t53;
$t64 = $t04 + $t14 + $t24 + $t34 + $t44 + $t54;
/* ----------------------------------- */
$ts0[1] = number_format(round($t01 - $t00, 6), 6);
$ts0[2] = number_format(round($t02 - $t01, 6), 6);
$ts0[3] = number_format(round($t03 - $t02, 6), 6);
$ts0[4] = number_format(round($t04 - $t03, 6), 6);
$min_idx = array_keys($ts0, min($ts0))[0];
foreach ($ts0 as $idx => $val) {
if ($idx == $min_idx) {
$ts0[$idx] = " $val ";
} else {
$ts0[$idx] = "/* $val */";
}
}
$ts1[1] = number_format(round($t11 - $t10, 6), 6);
$ts1[2] = number_format(round($t12 - $t11, 6), 6);
$ts1[3] = number_format(round($t13 - $t12, 6), 6);
$ts1[4] = number_format(round($t14 - $t13, 6), 6);
$min_idx = array_keys($ts1, min($ts1))[0];
foreach ($ts1 as $idx => $val) {
if ($idx == $min_idx) {
$ts1[$idx] = " $val ";
} else {
$ts1[$idx] = "/* $val */";
}
}
$ts2[1] = number_format(round($t21 - $t20, 6), 6);
$ts2[2] = number_format(round($t22 - $t21, 6), 6);
$ts2[3] = number_format(round($t23 - $t22, 6), 6);
$ts2[4] = number_format(round($t24 - $t23, 6), 6);
$min_idx = array_keys($ts2, min($ts2))[0];
foreach ($ts2 as $idx => $val) {
if ($idx == $min_idx) {
$ts2[$idx] = " $val ";
} else {
$ts2[$idx] = "/* $val */";
}
}
$ts3[1] = number_format(round($t31 - $t30, 6), 6);
$ts3[2] = number_format(round($t32 - $t31, 6), 6);
$ts3[3] = number_format(round($t33 - $t32, 6), 6);
$ts3[4] = number_format(round($t34 - $t33, 6), 6);
$min_idx = array_keys($ts3, min($ts3))[0];
foreach ($ts3 as $idx => $val) {
if ($idx == $min_idx) {
$ts3[$idx] = " $val ";
} else {
$ts3[$idx] = "/* $val */";
}
}
$ts4[1] = number_format(round($t41 - $t40, 6), 6);
$ts4[2] = number_format(round($t42 - $t41, 6), 6);
$ts4[3] = number_format(round($t43 - $t42, 6), 6);
$ts4[4] = number_format(round($t44 - $t43, 6), 6);
$min_idx = array_keys($ts4, min($ts4))[0];
foreach ($ts4 as $idx => $val) {
if ($idx == $min_idx) {
$ts4[$idx] = " $val ";
} else {
$ts4[$idx] = "/* $val */";
}
}
$ts5[1] = number_format(round($t51 - $t50, 6), 6);
$ts5[2] = number_format(round($t52 - $t51, 6), 6);
$ts5[3] = number_format(round($t53 - $t52, 6), 6);
$ts5[4] = number_format(round($t54 - $t53, 6), 6);
$min_idx = array_keys($ts5, min($ts5))[0];
foreach ($ts5 as $idx => $val) {
if ($idx == $min_idx) {
$ts5[$idx] = " $val ";
} else {
$ts5[$idx] = "/* $val */";
}
}
$ts6[1] = number_format(round($t61 - $t60, 6), 6);
$ts6[2] = number_format(round($t62 - $t61, 6), 6);
$ts6[3] = number_format(round($t63 - $t62, 6), 6);
$ts6[4] = number_format(round($t64 - $t63, 6), 6);
$min_idx = array_keys($ts6, min($ts6))[0];
foreach ($ts6 as $idx => $val) {
if ($idx == $min_idx) {
$ts6[$idx] = " $val ";
} else {
$ts6[$idx] = "/* $val */";
}
}
echo " | count | empty | comp | cast |\n";
echo "-------------|--------------|--------------|--------------|--------------|\n";
echo " Empty |";
echo $ts0[1] . '|';
echo $ts0[2] . '|';
echo $ts0[3] . '|';
echo $ts0[4] . "|\n";
echo " Uniform |";
echo $ts1[1] . '|';
echo $ts1[2] . '|';
echo $ts1[3] . '|';
echo $ts1[4] . "|\n";
echo " Integer |";
echo $ts2[1] . '|';
echo $ts2[2] . '|';
echo $ts2[3] . '|';
echo $ts2[4] . "|\n";
echo " String |";
echo $ts3[1] . '|';
echo $ts3[2] . '|';
echo $ts3[3] . '|';
echo $ts3[4] . "|\n";
echo " Mixed |";
echo $ts4[1] . '|';
echo $ts4[2] . '|';
echo $ts4[3] . '|';
echo $ts4[4] . "|\n";
echo " Associative |";
echo $ts5[1] . '|';
echo $ts5[2] . '|';
echo $ts5[3] . '|';
echo $ts5[4] . "|\n";
echo "-------------|--------------|--------------|--------------|--------------|\n";
echo " Total |";
echo $ts6[1] . '|';
echo $ts6[2] . '|';
echo $ts6[3] . '|';
echo $ts6[4] . "|\n";
===
而不是 ==
。
如果您想排除使用 empty()
会失败的错误行或空行(例如 0 => ''
),您可以尝试:
if (array_filter($playerlist) == []) {
// Array is empty!
}
array_filter():如果没有提供回调,所有等于 FALSE 的数组条目(请参阅转换为布尔值)将被删除。
如果您想删除所有 NULL、FALSE 和空字符串 (''
),但保留零值 (0
),您可以使用 strlen
作为回调,例如:
$is_empty = array_filter($playerlist, 'strlen') == [];
如果你想确定你正在测试的变量是否实际上是一个空数组,你可以使用这样的东西:
if ($variableToTest === array()) {
echo 'this is explicitly an empty array!';
}
为什么没有人说这个答案:
$array = [];
if($array == []) {
// array is empty
}
array()
是一回事。
===
而不是 ==
,因为它更快。
如果要检查可以使用的数组内容:
$arr = array();
if(!empty($arr)){
echo "not empty";
}
else
{
echo "empty";
}
见这里:http://codepad.org/EORE4k7v
empty()
。我的观点是没有必要。
is_array($detect) && empty($detect);
explode()
- 它返回数组类型的数据。检查 empty()
是不需要的函数调用。正如 Cobby 在 2012 年所说,只需 if($detect)
。不应为此任务或其他任务实施此解决方案。您可能会争辩说您所涵盖的情况超出了这个问题的范围,好吧,永远不需要在 is_array()
之后调用 empty()
因为如果变量没有“设置”,那么 is_array()
将生成“注意:未定义的变量",如果 isset()
那么 empty()
是矫枉过正,只需使用 Cobby 的答案。
if (is_array($detect) && $detect)
如果你想强制一个变量是数组,然后您可以将其转换为数组(将保留数组原样,将对象的第一级转换为数组,并将任何标量值转换为包含该值的单元素数组)$detect = (array)$detect; if ($detect)
$detect === []
,参见 Tim's above
在我看来,索引数组的最简单方法是:
if ($array) {
//Array is not empty...
}
如果数组不为空,则数组上的“if”条件将评估为 true,如果数组为空,则评估为 false。这不适用于关联数组。
我使用此代码
$variable = array();
if( count( $variable ) == 0 )
{
echo "Array is Empty";
}
else
{
echo "Array is not Empty";
}
但请注意,如果数组有大量键,则与此处的其他答案相比,此代码将花费大量时间计算它们。
count()
。我的观点是没有必要。
您可以使用适用于所有情况的 array_filter()
:
$ray_state = array_filter($myarray);
if (empty($ray_state)) {
echo 'array is empty';
} else {
echo 'array is not empty';
}
empty()
。我的观点是没有必要。
做出最合适的决定需要了解数据的质量以及要遵循的流程。
如果您要取消/忽略/删除此行,那么最早的过滤点应该在 mysql 查询中。
玩家不为空的地方
WHERE 玩家 != ''
WHERE COALESCE(玩家, '') != ''
其中玩家不为空且玩家!=''
...这有点取决于您的商店数据,还有其他方法,我会在这里停下来。
如果您不能 100% 确定该列是否存在于结果集中,那么您应该检查该列是否已声明。这意味着在列上调用 array_key_exists()、isset() 或 empty()。我不会费心在此处描述差异(该细分还有其他 SO 页面,这是一个开始:1、2、3)。也就是说,如果您不能完全控制结果集,那么您可能过度沉迷于应用程序的“灵活性”,并且应该重新考虑是否值得为可能访问不存在的列数据而带来麻烦。实际上,我是说您永远不需要检查是否声明了列 - 因此您永远不需要 empty() 来执行此任务。如果有人认为 empty() 更合适,那么他们就是在推动自己对脚本表达能力的个人看法。如果您发现下面 #5 中的条件不明确,请在您的代码中添加内联注释——但我不会。底线是进行函数调用没有编程优势。您的字符串值可能包含一个您想要认为是真实/有效/非空的 0 吗?如果是这样,那么您只需要检查列值是否有长度。
这是使用 strlen()
的 Demo。这将指示字符串在分解时是否会创建有意义的数组元素。
我认为重要的是要提到通过无条件爆炸,您可以保证生成一个非空数组。这里是证明: Demo 换句话说,检查数组是否为空是完全没有用的——它每次都是非空的。如果您的字符串不可能包含零值(因为,比如说,这是一个包含从 1 开始且仅递增的 id 的 csv),那么 if ($gamerow['players']) { 就是您所需要的——结束的故事。 ...但是等等,确定这个值的空虚之后你在做什么?如果您有一些期待 $playerlist 的脚本,但您有条件地声明该变量,那么您可能会使用前一行的值或再次生成通知。那么你需要无条件地将 $playerlist 声明为某个东西吗?如果字符串中没有真值,您的应用程序是否受益于声明一个空数组?很有可能,答案是肯定的。在这种情况下,您可以通过回退到一个空数组来确保该变量是数组类型的——这样,您是否将该变量输入一个循环就无关紧要了。以下条件声明都是等价的。
if ($gamerow['players']) { $playerlist = explode(',', $gamerow['players']); } 其他 { $playerlist = []; }
$playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];
为什么我要花这么多篇幅来解释这个非常基本的任务?
我已经举报了此页面上的几乎所有答案,并且该答案可能会引起报复性投票(这经常发生在捍卫该网站的举报人身上-如果答案有反对票且没有评论,请始终持怀疑态度)。我认为重要的是 Stackoverflow 是一个值得信赖的资源,它不会用错误信息和次优技术毒害研究人员。这就是我如何展示我对即将到来的开发人员的关心程度,以便他们了解如何以及为什么,而不是仅仅用勺子喂养一代复制粘贴程序员。我经常使用旧页面来关闭新的重复页面——这是知道如何快速找到重复页面的资深志愿者的责任。我不能让自己使用带有错误/错误/次优/误导性信息的旧页面作为参考,因为这样我就在积极地损害新的研究人员。
empty($gamerow['players'])
$matches = preg_grep ( "/^$text (\w+)/i" , $array ) ;
来检查它我使用 if ( count ( $matches ) > 0 )
empty()
做的工作太多。
我认为确定数组是否为空的最佳方法是使用 count() ,如下所示:
if(count($array)) {
return 'anything true goes here';
}else {
return 'anything false';
}
count()
调用 - 请参阅 Cobby 的回答。
$gamerow = mysql_fetch_array($gameresult);
if (!empty(($gamerow['players'])) {
$playerlist = explode(",", $gamerow['players']);
}else{
// do stuff if array is empty
}
这里不再重复已经说过的内容,只是经过测试,在 PHP-7.3 上更有效的方式是 !empty($myARR)
或 isset($myARR[0])
,两者显示相同的速度。其他任何东西都相当慢,包括 array_key_exists($myARR[0])
和只是比较 $myARR !== Array() | $myARR !== []
。所以,我更喜欢empty()
,简单快速。
$status = "";
$new_array = array();
if(!empty($new_array)){
$status = "1"; // not a blank array
}
else{
$status = "0"; // blank array
}
已经讨论了许多选项来检查数组是否为空或不包含值,因为有
if ($playerlist) {}
if (!empty($playerlist)) {}
if (count($playerlist) > 0) {}
都有其优点和缺点。
但是还有另一种选择,如果您确定您的数组只有数字键,从零开始(即如果您 explode()
一个字符串,则会发生这种情况):
if (isset($playerlist[0])) {
// do something
}
这甚至比其他解决方案快一点。
您可以使用以下 php 函数来检查数组是否为空
使用 empty()
函数
$variable = array();
if(empty($variable)){
echo("The array is empty.");
}
输出:数组为空
使用 sizeof()
函数
$variable = array();
$arraysize = sizeof($variable);
echo("The size of the array is $arraysize. \n");
if(sizeof($variable) == 0)
echo("The array is empty.");
输出:
数组的大小为 0。
数组为空。
array_filter 递归和计数
function array_filter_recursive(array $arr)
{
array_walk($arr,function(&$item){if (is_array($item)) { $item = array_filter_recursive($item);}});
return array_filter($arr);
}
function is_empty_array(array $arr):bool{
return count(array_filter_recursive($arr)) == 0;
}
测试
$c=['b'=>2,'c'=>3];
$a=[];
$b=[[]];
$d=['a'=>[]];
$e=['a'=>[],[]];
$f=['a'=>[[],[],[]],[]];
$g=[[[],[[],[[],[[],[]]]]],[]];
$i=[[[],[[],[[],[[],['s'=>1]]]]],[]];
var_dump(is_empty_array($c));//false
var_dump(is_empty_array($a));//true
var_dump(is_empty_array($b));//true
var_dump(is_empty_array($d));//true
var_dump(is_empty_array($e));//true
var_dump(is_empty_array($f));//true
var_dump(is_empty_array($g));//true
var_dump(is_empty_array($i));//false
我已经用下面的代码解决了这个问题。
$catArray=array();
$catIds=explode(',',$member['cat_id']);
if(!empty($catIds[0])){
foreach($catIds as $cat_id){
$catDetail=$this->Front_Category->get_category_detail($cat_id);
$catArray[]=$catDetail['allData']['cat_title'];
}
echo implode(',',$catArray);
}
这似乎适用于所有情况
if(!empty(sizeof($array)))
不定期副业成功案例分享
empty()
。if(!isset($emptyarray))
是false
,但if(empty($emptyarray))
返回true
。那只是钉了我