players
将为空或以逗号分隔的列表(或单个值) . 什么是最简单的方法来检查它是否's empty? I'假设我可以在将 $gameresult
数组提取到 $gamerow
时立即执行此操作?在这种情况下,如果它是空的,可以更有效地跳过爆炸 $playerlist
,但是为了参数,我如何检查数组是否也是空的?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
18 回答
如果要检查可能使用的阵列内容:
看到这里:http://codepad.org/EORE4k7v
您可以使用
array_filter()
,它适用于所有情况:这似乎适用于所有情况
一世使用此代码
但请注意,如果数组具有大量键,则此代码将花费大量时间计算它们,与此处的其他答案相比 .
如果您只需要检查数组中是否有任何元素
如果你需要在检查之前清除空值(通常是为了防止
explode
奇怪的字符串):PHP中的空数组是假的,因此您甚至不需要像其他人所建议的那样使用
empty()
.PHP的empty()确定变量是否不存在或是否具有假值(如
array()
,0
,null
,false
等) .在大多数情况下,您只想查看
!$emptyVar
. 如果变量可能未设置并且您不会触发E_NOTICE
,请使用empty($emptyVar)
; IMO这通常是一个坏主意 .一些不错的答案,但只是想我扩展一点,以便在PHP确定数组是否为空时更清楚地解释 .
主要说明:
具有键(或键)的数组将被PHP确定为非空 .
由于数组值需要存在键,因此只有没有键(因此没有值)时,在数组中具有值或不存在值不会确定它是否为空 .
因此,使用
empty()
检查数组不会简单地告诉您是否有值,它会告诉您数组是否为空,并且键是数组的一部分 .因此,在决定使用哪种检查方法之前,请考虑如何生成数组 .
EG当每个表单字段具有数组名称(即
name="array[]"
)时,当用户提交HTML表单时,数组将具有键 .将为每个字段生成非空数组,因为每个表单字段的数组都会有自动递增的键值 .
以这些数组为例:
如果您回显出上述数组的数组键和值,则会得到以下结果:
使用
empty()
测试上述数组会返回以下结果:分配数组但之后不使用数组时,数组将始终为空,例如:
这将是空的,即在上面使用if
empty()
时PHP将返回TRUE .因此,如果您的数组具有键 - 例如通过表单的输入名称或者您手动分配它们(即创建一个数据库列名称作为键但没有来自数据库的值/数据的数组),那么该数组将不是
empty()
.在这种情况下,您可以在foreach中循环数组,测试每个键是否有值 . 如果您需要运行数组,这可能是一个很好的方法,可能是检查键或清理数据 .
但是,如果您只是需要知道"if values exist"返回TRUE或FALSE,那么它不是最好的方法 . 有多种方法可以确定当数组知道它有密钥时是否有任何值 . 函数或类可能是最好的方法,但一如既往地取决于您的环境和确切的要求,以及其他事情,例如您目前对数组所做的事情(如果有的话) .
这是一种使用非常少的代码来检查数组是否具有值的方法:
使用
array_filter()
:迭代数组中的每个值,将它们传递给回调函数 . 如果回调函数返回true,则将数组中的当前值返回到结果数组中 . 数组键被保留 .
在所有三个示例数组上运行
array_filter()
(在此答案的第一个代码块中创建)会产生以下结果:因此,当没有值,是否有键时,使用
array_filter()
创建一个新数组,然后检查新数组是否为空显示原始数组中是否有任何值 .它不理想而且有点乱,但是如果你有一个庞大的数组并且不需要因为任何其他原因而循环它,那么就所需的代码来说这是最简单的 .
我没有检查开销的经验,但知道使用
array_filter()
和foreach
检查是否找到值之间的差异会很好 .显然,基准测试需要在各种参数上,在小型和大型阵列上以及何时存在值而不是等等 .
count($gamerow['players'])将为0 .
如果你想确定你正在测试的变量是否实际上是一个空数组,你可以使用这样的东西:
is_array
为什么没有人说这个答案:
如果您要排除false或空行(例如
0 => ''
),使用empty()
将失败,您可以尝试:如果你想删除所有NULL,FALSE和空字符串(
''
),但保留零值(0
),你可以使用strlen
作为回调,例如:我认为确定数组是否为空的最佳方法是使用count(),如下所示:
我用以下代码解决了这个问题 .
怎么样:
上述解决方案对我不起作用 . 相反,我使用更可靠的方式(它可能有移动开销):