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

asl*_*lum 431 php arrays

players将为空或以逗号分隔的列表(或单个值).检查它是否为空的最简单方法是什么?我假设我可以在将$gameresult数组取入后立即执行此操作$gamerow?在这种情况下,跳过爆炸它可能更有效,$playerlist如果它是空的,但为了参数,我如何检查数组是否也是空的?

$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Run Code Online (Sandbox Code Playgroud)

Tyl*_*ter 691

如果您只需要检查数组中是否有任何元素

if (empty($playerlist)) {
     // list is empty.
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在检查之前清除空值(通常是为了防止explode奇怪的字符串):

foreach ($playerlist as $key => $value) {
    if (empty($value)) {
       unset($playerlist[$key]);
    }
}
if (empty($playerlist)) {
   //empty array
}
Run Code Online (Sandbox Code Playgroud)

  • 鉴于他的代码示例,将设置变量,因此您不需要使用`empty()`. (5认同)
  • 小心!`if(!isset($ emptyarray))`是`false`但是`if(empty($ emptyarray))`返回`true`.那只是把我钉在了一起 (4认同)
  • 你不应该只用空吗?计算大型阵列将需要更长的时间。 (2认同)
  • @Kolob Canyon ..你在期待什么?(假设您实际上定义了一个数组...)。对我来说,某些东西可以被“设置”并被“空”,这是有道理的。 (2认同)
  • @DanMcG `count()` 是一个存储值(`O(1)`)...请注意数组卷与性能无关:/sf/ask/319642011/ 和 https:// stackoverflow.com/q/5835241/2943403 `count()` 和 `!empty()` 都是对已声明数组的不必要的调用。/sf/answers/4197068501/ (2认同)

Cob*_*bby 147

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

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

PHP的empty()确定是否变量不存在或具有falsey的值(如array(),0,null,false,等等).

在大多数情况下,您只想检查!$emptyVar.使用empty($emptyVar)如果变量可能没有设置,你不惯于触发E_NOTICE; IMO这通常是一个坏主意.

  • 我希望这不会改变某些标准...会很痛苦 (2认同)

Jam*_*mes 78

一些不错的答案,但只是想我会扩展一点,以便在PHP确定数组是否为空时更清楚地解释.


主要说明:

具有键(或键)的数组将被PHP 确定为非空.

由于数组值需要存在键,因此只有在没有键(因此没有值)时,在数组中具有值或不存在值不会确定它是否为空.

因此,检查数组empty()并不只是告诉您是否有值,它会告诉您数组是否为空,并且键是数组的一部分.


因此,在决定使用哪种检查方法之前,请考虑如何生成阵列.
EG 当每个表单字段具有数组名称(即)时,当用户提交HTML表单时,数组具有键name="array[]".
非空阵列将每个字段来制备会有自动递增键值为每个表单字段的阵列.

以这些数组为例:

/* 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[] = '';
Run Code Online (Sandbox Code Playgroud)

如果您回显出上述数组的数组键和值,则会得到以下结果:

ARRAY ONE:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]

ARRAY TWO:
[0] => [UserValue01]
[1] => [UserValue02]

ARRAY THREE:
[0] => []
[1] => []

并测试上面的数组empty()返回以下结果:

ARRAY ONE:
$ ArrayOne不是空的

ARRAY TWO:
$ ArrayTwo不是空的

ARRAY THREE:
$ ArrayThree不为空

分配数组但之后不使用数组时,数组将始终为空,例如:

$ArrayFour = array();
Run Code Online (Sandbox Code Playgroud)

这将是空的,即empty()在上面使用if时PHP将返回TRUE .

因此,如果您的数组具有键 - 例如通过表单的输入名称或者您手动分配它们(即创建一个数据库列名称作为键但没有来自数据库的值/数据的数组),那么数组将不会empty().

在这种情况下,您可以在foreach中循环数组,测试每个键是否有值.如果您需要运行数组,这可能是一个很好的方法,可能是检查密钥或清理数据.

但是,如果您只需要知道"如果值存在",则返回TRUEFALSE并不是最好的方法.有多种方法可以确定当数组知道它有密钥时是否有任何值.函数或类可能是最好的方法,但一如既往地取决于您的环境和确切的要求,以及其他诸如您目前对数组所做的事情(如果有的话).


这是一种使用非常少的代码来检查数组是否具有值的方法:

使用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
  }
Run Code Online (Sandbox Code Playgroud)

运行array_filter()在所有三个实施例的阵列(在此答案第一码块创建)导致以下:

ARRAY ONE:
$ arrayone不为空

ARRAY TWO:
$ arraytwo不为空

ARRAY THREE:
$ arraythree是空的

因此,当没有值,是否有键时,使用array_filter()创建新数组然后检查新数组是否为空显示原始数组中是否有任何值.
它不理想而且有点乱,但是如果你有一个庞大的数组并且不需要因为任何其他原因而循环它,那么就所需的代码来说这是最简单的.


我没有检查开销的经验,但知道使用array_filter()foreach检查是否找到值之间的差异会很好.

显然,基准测试需要在各种参数上,小型和大型阵列以及何时存在值而不是等等.

  • 非常感谢你.它确实非常丰富,能够使用`array_filter()`来解决我的问题 (2认同)
  • @mboullouz `count(array())==0` 当有键而没有值时为 false,因此这无助于仅检查值。您的陈述是正确的,但您正在强制使用“count(array())”进行测试,因为数组当然是空的。我们需要检查数组何时从表单或其他地方返回,以了解它是否为空(键/值)或只有值 (2认同)
  • 感谢您的详细说明。 (2认同)

Ign*_*ams 19

count($gamerow['players']) 将是0.

  • 老派da一如既往地最好,只需检查数组的索引即可。 (2认同)

Tim*_*lvy 12

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

if ($variableToTest === array()) {
    echo 'this is explicitly an empty array!';
}
Run Code Online (Sandbox Code Playgroud)


Kaa*_*aan 11

我运行了帖子末尾的基准测试。要比较这些方法:

  • count($arr) == 0 : 数数
  • empty($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 */|
Run Code Online (Sandbox Code Playgroud)

空和转换为布尔值之间的区别是微不足道的。我已多次运行此测试,它们似乎基本相同。数组的内容似乎并不重要。两者产生相反的结果,但逻辑否定几乎不足以在大多数情况下推动铸造获胜,所以我个人更喜欢空的,为了在任何一种情况下的易读性。

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 */|
Run Code Online (Sandbox Code Playgroud)

  • 您确实应该使用“===”而不是“==”。 (3认同)

Rob*_*Rob 8

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

$array = [];

if($array == []) {
    // array is empty
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用此方法,您还应该使用 `===` 而不是 `==`,因为它更快。 (3认同)
  • 你的说法不正确。一年前确实有人说过这个答案——蒂姆·奥格维。使用方括号代替 `array()` 是一样的。 (2认同)

zlo*_*ctb 7

is_array($detect) && empty($detect);
Run Code Online (Sandbox Code Playgroud)

is_array


ken*_*orb 7

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

if (array_filter($playerlist) == []) {
  // Array is empty!
}
Run Code Online (Sandbox Code Playgroud)

array_filter():如果未提供回调,则将删除所有等于FALSE的数组条目(请参阅转换为boolean)。

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

$is_empty = array_filter($playerlist, 'strlen') == [];
Run Code Online (Sandbox Code Playgroud)


小智 5

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

$arr = array();

if(!empty($arr)){
  echo "not empty";
}
else 
{
  echo "empty";
}
Run Code Online (Sandbox Code Playgroud)

看到这里:http : //codepad.org/EORE4k7v


PJa*_*ely 5

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

    if ($array) {
      //Array is not empty...  
    }
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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