players
将为空或以逗号分隔的列表(或单个值)。检查它是否为空的最简单方法是什么?我假设只要将$gameresult
数组提取到$gamerow
?中就可以这样做。在这种情况下,跳过展开$playerlist
是否为空可能会更有效,但是出于参数的考虑,我将如何检查数组是否也为空?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
players
将为空或以逗号分隔的列表(或单个值)。检查它是否为空的最简单方法是什么?我假设只要将$gameresult
数组提取到$gamerow
?中就可以这样做。在这种情况下,跳过展开$playerlist
是否为空可能会更有效,但是出于参数的考虑,我将如何检查数组是否也为空?
$gamerow = mysql_fetch_array($gameresult);
$playerlist = explode(",", $gamerow['players']);
Answers:
如果只需要检查数组中是否有任何元素
if (empty($playerlist)) {
// list is empty.
}
如果您需要在检查之前清除空值(通常是为了防止产生explode
奇怪的字符串):
foreach ($playerlist as $key => $value) {
if (empty($value)) {
unset($playerlist[$key]);
}
}
if (empty($playerlist)) {
//empty array
}
empty()
。
if(!isset($emptyarray))
是false
但if(empty($emptyarray))
返回true
。那真是令我
空数组在PHP中是错误的,因此您甚至不需要empty()
像其他人建议的那样使用。
<?php
$playerList = array();
if (!$playerList) {
echo "No players";
} else {
echo "Explode stuff...";
}
// Output is: No players
PHP的empty()
确定是否变量不存在或具有falsey的值(如array()
,0
,null
,false
,等等)。
在大多数情况下,您只需要检查即可!$emptyVar
。使用empty($emptyVar)
如果变量可能没有已定,你不这样做不会触发E_NOTICE
; IMO这通常是一个坏主意。
一些不错的答案,但我只是想扩展一下以更清楚地解释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[] = '';
如果回显上述数组的数组键和值,则会得到以下信息:
数组一:
[UserKeyA] => [UserValueA]
[UserKeyB] => [UserValueB]数组二:
[0] => [UserValue01]
[1] => [UserValue02]数组三:
[0] => []
[1] => []
测试上面的数组empty()
将返回以下结果:
数组一:
$ ArrayOne不为空数组二:
$ ArrayTwo不为空数组三:
$ ArrayThree不为空
分配数组时,数组将始终为空,但此后不要使用它,例如:
$ArrayFour = array();
这将是空的,即如果empty()
在上面使用if ,则PHP将返回TRUE 。
因此,如果您的数组具有键(例如通过表单的输入名称或您手动分配它们)(即创建一个以数据库列名称为键但没有来自数据库的值/数据的数组),则该数组将不是 empty()
。
在这种情况下,您可以在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为空
因此,当没有值时,是否有键,array_filter()
用于创建一个新数组,然后检查新数组是否为空,这表明原始数组中是否有任何值。
它不是理想的,而且有点混乱,但是如果您有一个庞大的数组,并且不需要出于任何其他原因循环遍历,那么就所需的代码而言,这是最简单的。
我没有检查开销的经验,但是最好知道使用array_filter()
和foreach
检查值之间的区别。
显然,基准测试需要在各种参数上,在大小数组上,在有值的情况下,等等。
array_filter()
count(array())==0
当有键且没有值时,@ mboullouz 为false,因此这仅有助于检查值。您的陈述是正确的,但count(array())
由于数组为空,因此您将强制使用。我们需要检查数组何时从表单或其他地方返回,以了解其是否为空(键/值)或是否只有值
array_filter($_FILES["documento"]['name'])
如果要确定所测试的变量是否实际上是一个明确的空数组,则可以使用以下方法:
if ($variableToTest === array()) {
echo 'this is explicitly an empty array!';
}
如果您想排除错误或空行(例如0 => ''
),则使用empty()
会失败,您可以尝试:
if (array_filter($playerlist) == []) {
// Array is empty!
}
array_filter()
:如果未提供回调,则将删除所有等于FALSE的数组条目(请参阅转换为boolean)。
如果您想删除所有NULL,FALSE和空字符串(''
),但保留零值(0
),则可以strlen
用作回调,例如:
$is_empty = array_filter($playerlist, 'strlen') == [];
为什么没有人说这个答案:
$array = [];
if($array == []) {
// array is empty
}
array()
是一回事。
is_array($detect) && empty($detect);
explode()
-它返回数组类型的数据。检查empty()
是不需要的函数调用。正如Cobby在2012年所说的,仅此而已if($detect)
。不应为此任务或其他任务实施此解决方案。你可能会认为你是覆盖情况超出了这个问题的范围,以及,从未有一个需要调用empty()
后is_array()
,因为如果变量不是“设置”,然后is_array()
将生成“通知:未定义的变量”,如果isset()
再empty()
是矫枉过正,只是使用科比的答案。
我运行了帖子结尾处包含的基准。比较方法:
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 */|
空和强制转换为布尔值之间的区别不大。我已经多次运行了此测试,它们看起来基本上是等效的。数组的内容似乎没有发挥重要作用。两者产生相反的结果,但是逻辑上的否定在大多数情况下都不足以推动演员选举获胜,因此,出于个人可读性考虑,我个人都更倾向于空着。
#!/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";
如果要检查数组内容,可以使用:
$arr = array();
if(!empty($arr)){
echo "not empty";
}
else
{
echo "empty";
}
看到这里:http : //codepad.org/EORE4k7v
我认为索引数组的最简单方法是:
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";
}
但是请注意,与此处的其他答案相比,如果数组具有大量键,则此代码将花费大量时间对它们进行计数。
您可以使用array_filter()
在所有情况下都适用的方法:
$ray_state = array_filter($myarray);
if (empty($ray_state)) {
echo 'array is empty';
} else {
echo 'array is not empty';
}
$gamerow = mysql_fetch_array($gameresult);
if (!empty(($gamerow['players'])) {
$playerlist = explode(",", $gamerow['players']);
}else{
// do stuf if array is empty
}
我认为确定数组是否为空的最好方法是使用count(),如下所示:
if(count($array)) {
return 'anything true goes here';
}else {
return 'anything false';
}
count()
可以完全删除该呼叫-请参阅Cobby的答案。
如果您要取消/忽略/删除该行,则最早的过滤点应该在mysql查询中。
WHERE players IS NOT NULL
WHERE players != ''
WHERE COALESCE(players, '') != ''
WHERE players IS NOT NULL AND players != ''
如果您不确定100%是否在结果集中存在该列,则应检查该列是否已声明。这意味着在列上调用array_key_exists()
,isset()
或empty()
。我不会去打扰这里的划定不同(有用于击穿其他SO页面,这里是一个开始:1,2,3)。就是说,如果您不能完全控制结果集,则可能是您对应用程序的“灵活性”过于迷恋,因此应该重新考虑是否值得潜在地访问不存在的列数据。 实际上,我是说您永远不需要检查是否已声明一列,因此,您永远不需要empty()
执行此任务。 如果有人在争论empty()
更合适,那么他们就对脚本的表达力发表自己的个人看法。如果您发现以下#5中的条件不明确,请在代码中添加内联注释,但我不会。最重要的是,进行函数调用没有程序优势。
您的字符串值可能包含0
您想视为真/有效/非空的吗?如果是这样,则只需要检查列值是否具有长度。
这里是一个演示使用strlen()
。这将指示该字符串爆炸后是否会创建有意义的数组元素。
我认为重要的是要提到,通过无条件爆炸,可以保证您生成一个非空数组。 证明:演示 换句话说,检查数组是否为空是完全没有用的-每次都将是非空的。
如果您的字符串可能不会包含零值(例如,这是一个由ID开头1
且只能递增的id组成的csv ),那么if ($gamerow['players']) {
您所需要的只是故事的结尾。
...但是等等,确定此值的空后您要做什么?如果您有一些期望的向下脚本$playerlist
,但有条件地声明该变量,则可能会冒用前一行的值或再次生成通知的风险。那么,您是否需要无条件声明$playerlist
为某些东西?如果字符串中没有真实值,那么您的应用程序会从声明空数组中受益吗?答案是肯定的。在这种情况下,您可以通过退回到空数组来确保变量为数组类型-这样,如果您将该变量馈入循环中就没有关系了。以下条件声明都是等效的。
$playerlist = $gamerow['players'] ? explode(',', $gamerow['players']) : [];
为什么我要花这么长时间来解释这个非常基本的任务?
empty($gamerow['players'])
$matches = preg_grep ( "/^$text (\w+)/i" , $array ) ;
进行检查if ( count ( $matches ) > 0 )
empty()
做的工作太多。
我已经通过以下代码解决了这个问题。
$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)))
怎么样:
DepartmentPerSchool = array(); (空(is_array($ DepartmentPerSchool)))?$ DepartmentPerSchool //或echo不为空:array('not set'=>'Not set。Contact Admin'); //或者echo为空