检查所有数组项是否为空PHP


81

我要从表单中添加一系列项目,如果所有项目都是空的,我想执行一些验证并将其添加到错误字符串中。所以我有:

$array = array(
    'RequestID'       => $_POST["RequestID"],
    'ClientName'      => $_POST["ClientName"],
    'Username'        => $_POST["Username"],
    'RequestAssignee' => $_POST["RequestAssignee"],
    'Status'          => $_POST["Status"],
    'Priority'        => $_POST["Priority"]
);

然后,如果所有数组元素均为空,请执行:

$error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';

5
对于阅读本文档感到困惑的任何人,请勿将$ _POST括在单引号中-它将不会被评估!
杰米

2
我放弃了编辑报价的自由。
xtofl

Answers:


176

您可以只使用内置的array_filter

如果未提供回调,则将删除所有等于FALSE的输入项(请参阅转换为布尔值)。

因此可以在一条简单的代码行中做到这一点。

if(!array_filter($array)) {
    echo '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

1
我很好奇这是否比我建议的爆破方法快。有基准吗?
胶囊

array_filter()@ dogmatic69已经提到过。关于绩效-我相信简单的foreach应该比速度更快array_filter()implode()
binaryLV

这是内置函数phpbench.com的php基准测试的好地方,但是大概取决于数组的大小。数组越大,此方法将越快。
xzyfer

1
@xzyfer,if(implode($array)) echo '..'即使一个数组元素为,也将打印“ ..” (string)"0"。关于foreach慢于array_filter()-您确定吗?与仅读取数组元素相比,删除数组元素的速度如何快一个?
binaryLV

2
@xzyfer,我做了一些测试-array_filter()仅用于检查是否填充了任何值,比使用一些用于存储结果和第一个无效值的布尔变量的基本循环至少慢了几倍。即使是“原生PHP函数”,它也不能比创建新的数组变量真正快。foreachbreakarray_filter()foreach
binaryLV

20

用空胶水将数组内插,并检查结果字符串的大小:

<?php if (strlen(implode($array)) == 0) echo 'all values of $array are empty'; ?>

您可以删除strlen呼叫以提高效率。if(implode($array)) echo '..'
xzyfer

@binaryLV,怎么回事?同意他们俩都无法解决问题。但是它们不相等,不是吗?
xzyfer

1
@xzyfer,如果$str(string)'0',则strlen($str) == 0计算为false,而!$str评估为true,因此strlen($str) == 0不能替换为!$str
binaryLV

与使用相比array_filter,此解决方案感觉更正确,因为array_filter它旨在与回调一起使用,以过滤数组。但是您要做的就是检查“空虚”。因此,您将其制成字符串并检查其长度。辉煌。
kasimir 2012年

2
@kasimir的回调函数array_filter是可选的,并且手册明确指出如果未提供回调,则将删除所有等于FALSE的输入项(请参阅转换为布尔值)。因此,使用array_filter方法的正确性不亚于此,它只是一种不同的方法;-)
Capsule

7

有一个较旧的问题,但认为我会弹出我的解决方案,因为上面没有列出。

function isArrayEmpty($array) {
    foreach($array as $key => $val) {
        if ($val !== '')
            return false;
    }
    return true;
}

1
empty()可能会提供假阳性结果。有关该函数如何处理falsey值的信息,请参见手册。我建议strlen()改为致电。
mickmackusa

感谢您提醒有关虚假@mickmackusa,我已将其更新为显式检查空字符串。
mulquin

2

您真的不需要它。
您将分别验证这些字段,并通过完成此过程可以判断数组是否为空(或包含无效值,这是相同的)


有趣!我想知道这是否比内爆数组更快。
胶囊

2
@Capsule的数组大小为6,即使您一生都在检查数组,也永远不会看到丝毫差别。对于超过1000的大小,我建议根本不要使用数组。
您的常识

由于我们在谈论网站,因此您必须将其乘以访问者人数。1000个或100个访问者的数组计算10个数组的CPU成本相同。您不能决定停止使用数组,因为您的网站越来越受欢迎;-)
Capsule

2

简化使用这种方式:

$array = []; //target array
$is_empty = true; //flag

foreach ($array as $key => $value) {
    if ($value != '')
        $is_empty = false;
}
if ($is_empty)
    echo 'array is empty!';
else
    echo 'array is not empty!';

0

您对$ array的定义不正确,并且具有单引号。它应显示为:

$array = array( 'RequestID' =>  $_POST["RequestID"],
                'ClientName' => $_POST["ClientName"],
                'Username' => $_POST["Username"],
                'RequestAssignee' => $_POST["RequestAssignee"],
                'Status' => $_POST["Status"],
                'Priority' => $_POST["Priority"] );

3
您可以使用。双引号实际上稍微慢一些。
亚伦·哈伦

@AaronHarun。查看问题的原始版本,该版本的引号错误。就是说,这可以纠正该问题,但不会尝试真正回答问题本身。
TRiG

-1

我有同样的问题,但想分别检查数组中的每个元素以查看哪个为空。这比预期的难,因为您需要在单独的数组中创建键值和实际值,以检查并响应空数组元素。

print_r($requestDecoded);
$arrayValues = array_values($requestDecoded);  //Create array of values
$arrayKeys = array_keys($requestDecoded);      //Create array of keys to count
$count = count($arrayKeys);
for($i = 0; $i < $count; $i++){  
    if ( empty ($arrayValues[$i] ) ) {         //Check which value is empty
        echo $arrayKeys[$i]. " can't be empty.\r\n";
    } 
}

结果:

Array
(
    [PONumber] => F12345
    [CompanyName] => Test
    [CompanyNum] => 222222
    [ProductName] => Test
    [Quantity] =>
    [Manufacturer] => Test
)

数量不能为空。


什么?只需使用foreach($array as $key => $value)并测试是否$value为空。
胶囊

-2

未测试但您了解逻辑:)

$error = 0;
foreach ($array as $k => $v){
    if (empty($v)) {
        $error++;
    }
}

if ($error == count($array)) {
    $error_str .= '<li>Please enter a value into at least one of the fields regarding the request you are searching for.</li>';
}

2
(不是我的不赞成,但是...)这根本不是一种稳定/可靠的方法。 3v4l.org/g3Jf6 请删除此答案,以免使读者感到困惑或更糟-鼓励他们使用错误的方法。
mickmackusa

-4

这很简单:

foreach($array as $k => $v)
{
    if(empty($v))
    {
        unset($array[$k]);
    }
}
$show_error = count($array) == 0;

您还必须将数组值的封装更改为双引号。


他不需要电话号码。仅1个就足够了
您的常识

什么?,他想知道所有元素是否为空,没有数字只是布尔值
-RobertPitt

我认为上校大胆地说的是,在PHPcount($array) == 0和PHP中两者都count($array)评估为true,因此多余的比较和赋值步骤是不必要的。虽然在php中作业的花费很少。
xzyfer

嗯,是的,实际上并没有太大的不同,但是我宁愿在大多数时候都使用boolean,但我不明白为何要投反对票,这是一种可行的方法,并且会为他带来所需的结果。
罗伯特·皮特(RobertPitt)2011年

说一个数组是否为空,仅查找一个填充元素就足够了。它称为LOGIC。
您的常识
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.