ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 PHP 检查数组是否为空?

players 将为空或以逗号分隔的列表(或单个值)。检查它是否为空的最简单方法是什么?我假设我可以在将 $gameresult 数组提取到 $gamerow 后立即这样做?在这种情况下,如果 $playerlist 为空,则跳过爆炸可能会更有效,但为了论证,我将如何检查数组是否也为空?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);

Y
Your Common Sense

如果您只需要检查数组中是否有任何元素,则可以使用数组本身,因为 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
}

你不应该只使用空吗? count 将需要更长的时间来执行大型阵列。
完毕。我还更改了它,因为您不必使用 isset 和其他东西。
鉴于他的代码示例,将设置变量,因此您不需要使用 empty()
小心! if(!isset($emptyarray))false,但 if(empty($emptyarray)) 返回 true。那只是钉了我
@Kolob Canyon .. 你在期待什么? (假设您实际上定义了一个数组......)。对我来说,可以“设置”和“空”是有道理的。
C
Cobby

空数组在 PHP 中是错误的,因此您甚至不需要像其他人建议的那样使用 empty()

<?php
$playerList = array();
if (!$playerList) {
    echo "No players";
} else {
    echo "Explode stuff...";
}
// Output is: No players

PHP 的 empty() 确定变量是否不存在或具有虚假值(如 array()0nullfalse 等)。

在大多数情况下,您只想检查 !$emptyVar。如果变量可能尚未设置并且您不想触发 E_NOTICE,请使用 empty($emptyVar); IMO 这通常是一个坏主意。


我希望这不会以某种标准改变......这会很痛苦
J
James

一些不错的答案,但只是想我会扩展一点,以便在 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() 解决我的问题
empty(array()) 将始终评估为 FALSE,因此添加 count(array())==0 将产生 true
@mboullouz count(array())==0 在有键但没有值时为假,因此这无助于仅检查值。您的陈述是正确的,但是您正在强制使用 count(array()) 进行测试,因为数组当然是空的。我们需要检查数组何时从表单或其他地方返回,以了解它是空的(键/值)还是只有值
此解决方案非常适合此类数组,例如,当您想要验证输入文件时它会有所帮助 array_filter($_FILES["documento"]['name'])
I
Ignacio Vazquez-Abrams

count($gamerow['players']) 将为 0。


old school da 最好一如既往,只需检查数组的索引。
k
kaan_a

我运行了包含在帖子末尾的基准测试。比较方法:

计数($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";

很好的基准,但您忘记了 sizeofempty 的 [不是?] 别名... stackoverflow.com/a/51986794/1429432
仅供参考:当我使用 PHP 7.4 运行这个基准测试时,我得到了不同的结果,表明比较是最快的。
您确实应该使用 === 而不是 ==
k
kenorb

如果您想排除使用 empty() 会失败的错误行或空行(例如 0 => ''),您可以尝试:

if (array_filter($playerlist) == []) {
  // Array is empty!
}

array_filter():如果没有提供回调,所有等于 FALSE 的数组条目(请参阅转换为布尔值)将被删除。

如果您想删除所有 NULL、FALSE 和空字符串 (''),但保留零值 (0),您可以使用 strlen 作为回调,例如:

$is_empty = array_filter($playerlist, 'strlen') == [];

这是另一个问题的正确答案。使用数组过滤器将破坏具有错误值的现有元素。这不是OP所要求的。
T
Tim Ogilvy

如果你想确定你正在测试的变量是否实际上是一个空数组,你可以使用这样的东西:

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}

R
Rob

为什么没有人说这个答案:

$array = [];

if($array == []) {
    // array is empty
}

你的说法不正确。有人确实说过这个答案——蒂姆·奥格威——一年前。使用方括号代替 array() 是一回事。
虽然在引擎盖下它是相同的答案......从技术上讲。我使用方括号而不是过时的数组函数。
如果您使用此方法,您还应该使用 === 而不是 ==,因为它更快。
@Minding:不仅因为它更快,而且因为它更正确。
A
Arun A S

如果要检查可以使用的数组内容:

$arr = array();

if(!empty($arr)){
  echo "not empty";
}
else 
{
  echo "empty";
}

见这里:http://codepad.org/EORE4k7v


正如 Cobby 在 2012 年所展示的,不需要调用函数来检查声明的数组是否为空。
@mickmackusa 我不同意你的观点。按照这个逻辑,我们可以解散empty(),因为empty检查是否设置了变量以及该值是否为假。有些人宁愿为可读性创建(几乎不引人注意的)开销。
如果您更喜欢声明式编码风格,请使用 empty()。我的观点是没有必要。
z
zloctb
is_array($detect) && empty($detect);

is_array


这些都是不必要的检查。 OP 正在调用 explode() - 它返回数组类型的数据。检查 empty() 是不需要的函数调用。正如 Cobby 在 2012 年所说,只需 if($detect)。不应为此任务或其他任务实施此解决方案。您可能会争辩说您所涵盖的情况超出了这个问题的范围,好吧,永远不需要在 is_array() 之后调用 empty() 因为如果变量没有“设置”,那么 is_array() 将生成“注意:未定义的变量",如果 isset() 那么 empty() 是矫枉过正,只需使用 Cobby 的答案。
@mickmackusa 如果设置了变量(设置为空数组)怎么办?也许您想检查要评估的数据是否甚至是一个数组,然后您想检查它是否为空。
@Itry 再次,如果你想检查一个声明的变量是否是一个数组并且是非空的,那么这就是所需要的:if (is_array($detect) && $detect)如果你想强制一个变量是数组,然后您可以将其转换为数组(将保留数组原样,将对象的第一级转换为数组,并将任何标量值转换为包含该值的单元素数组)$detect = (array)$detect; if ($detect)
等同于 $detect === [],参见 Tim's above
P
PJately

在我看来,索引数组的最简单方法是:

    if ($array) {
      //Array is not empty...  
    }

如果数组不为空,则数组上的“if”条件将评估为 true,如果数组为空,则评估为 false。这不适用于关联数组。


早在 2012 年,Cobby 就有效地说明了这种技术。他的回答目前有 133 票赞成。
这并不是“最简单”的观点——它是最简单的,因为没有更简洁的语法,而且没有函数调用开销。使用索引键和关联键访问数组完全没有区别。这个答案误导了研究人员。这个答案是冗余,然后是不正确3v4l.org/DSLha
D
David Spector

我使用此代码

$variable = array();

if( count( $variable ) == 0 )
{
    echo "Array is Empty";
}
else
{
    echo "Array is not Empty";
}

但请注意,如果数组有大量键,则与此处的其他答案相比,此代码将花费大量时间计算它们。


正如 Cobby 在 2012 年所展示的,不需要调用函数来检查声明的数组是否为空。
@mickmackusa 我不同意你的观点。按照这个逻辑,我们可以解散empty(),因为empty检查是否设置了变量以及该值是否为假。有些人宁愿为可读性创建(几乎不引人注意的)开销
如果您更喜欢声明式编码风格,请使用 count()。我的观点是没有必要。
r
reformed

您可以使用适用于所有情况的 array_filter()

$ray_state = array_filter($myarray);

if (empty($ray_state)) {
    echo 'array is empty';
} else {
    echo 'array is not empty';
}

这个答案是采用不必要的检查。首先,OP 对在检查数组的空性之前过滤数组中的任何虚假值不感兴趣——所以你已经偏离了发布的问题。其次,正如 Cobby 在 2012 年所展示的,不需要调用函数来检查声明的数组是否为空。
@mickmackusa 我不同意你的观点。按照这个逻辑,我们可以解散empty(),因为empty检查是否设置了变量以及该值是否为假。有些人宁愿为可读性创建(几乎不引人注意的)开销
如果您更喜欢声明式编码风格,请使用 empty()。我的观点是没有必要。
m
mickmackusa

做出最合适的决定需要了解数据的质量以及要遵循的流程。

如果您要取消/忽略/删除此行,那么最早的过滤点应该在 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 是一个值得信赖的资源,它不会用错误信息和次优技术毒害研究人员。这就是我如何展示我对即将到来的开发人员的关心程度,以便他们了解如何以及为什么,而不是仅仅用勺子喂养一代复制粘贴程序员。我经常使用旧页面来关闭新的重复页面——这是知道如何快速找到重复页面的资深志愿者的责任。我不能让自己使用带有错误/错误/次优/误导性信息的旧页面作为参考,因为这样我就在积极地损害新的研究人员。


@ptr 在这里。
D
Dan McGrath
empty($gamerow['players'])

有时你不知道元素数组键值 $matches = preg_grep ( "/^$text (\w+)/i" , $array ) ; 来检查它我使用 if ( count ( $matches ) > 0 )
假设该列存在于结果集中,因此 empty() 做的工作太多。
@Salem,在转换为 PHP 7.2 .x 之前,我曾经做过同样的事情(即“计数”)。尽管次要版本不应该实现反向更改的“规则”,但是当对空数组执行“count($myArray)”时,此版本的 php 会引发警告。这会导致问题(至少在我的代码中,并且我知道某些框架会将其“升级”为异常)。所以请注意 php.ini 中的这个“陷阱”。现在,我必须转换我的数组( (array)$myArray ,即使它已经被定义为一个数组。奇怪而愚蠢,IMO。
A
Anas Red

我认为确定数组是否为空的最佳方法是使用 count() ,如下所示:

if(count($array)) {
    return 'anything true goes here';
}else {
    return 'anything false'; 
}

可以完全删除 count() 调用 - 请参阅 Cobby 的回答。
c
commadelimited
 $gamerow = mysql_fetch_array($gameresult);

if (!empty(($gamerow['players'])) {
   $playerlist = explode(",", $gamerow['players']);
}else{
 
  // do stuff if array is empty
}

R
Robbie KN

这里不再重复已经说过的内容,只是经过测试,在 PHP-7.3 上更有效的方式!empty($myARR)isset($myARR[0]),两者显示相同的速度。其他任何东西都相当慢,包括 array_key_exists($myARR[0]) 和只是比较 $myARR !== Array() | $myARR !== []。所以,我更喜欢empty(),简单快速。


A
Ankur prajapati
$status = "";

$new_array = array();

if(!empty($new_array)){
  $status = "1";   // not a blank array
}
else{
  $status = "0";   // blank array
}

r
rabudde

已经讨论了许多选项来检查数组是否为空或不包含值,因为有

if ($playerlist) {}

if (!empty($playerlist)) {}

if (count($playerlist) > 0) {}

都有其优点和缺点。

但是还有另一种选择,如果您确定您的数组只有数字键,从零开始(即如果您 explode() 一个字符串,则会发生这种情况):

if (isset($playerlist[0])) {
  // do something
}

这甚至比其他解决方案快一点。


H
Hassan Qasim

您可以使用以下 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。

数组为空。


J
Juan Carlos Constantine

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

令我惊讶的是,这个问题的答案已经被接受了十多年,并且仍然得到了新的答案。
S
Suraj Kumar

我已经用下面的代码解决了这个问题。

$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);
}

欢迎来到堆栈溢出!感谢您提供代码片段,它可能会提供一些有限的即时帮助。通过描述为什么这是解决问题的好方法,正确的解释将极大地改进其 long-term value,并使其对有其他类似问题的未来读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
M
Madhu Nair

这似乎适用于所有情况

if(!empty(sizeof($array)))

这有太多的开销。任何开发人员都不应出于任何原因实施此解决方案。
@mickmackusa 很好,但是新手如何学会识别哪些操作构成过多的开销?什么是赠品,或者没有运行性能测试的过多开销的面值标准是什么?
@ptr 每个函数调用都有一个“成本”。如果一项任务可以在没有函数调用的情况下完成,它将胜过使用函数调用的技术。
@ptr 我已经为这个问题发布了一个全面的答案。我希望它能消除您对此特定页面的任何疑虑。
@mickmackusa 你的意思是包含另一个帖子的链接吗?