如何测试数组中是否有空值?

时间:2015-02-08 17:26:15

标签: php arrays

我有一个我要测试空元素的数组,我尝试使用array_walk来遍历数组(单维数组),如果元素数组(值)有任何空元素,则返回true。

我自然而然地去了PHP网站,查看了所提供的示例,它们没有任何意义,因为它没有给出如何使用array_walk的明确示例。我尝试过array_filter,这似乎也没什么用。

我试图做的例子。

$test = array("Tree"=>"Ash","TreeID"=>"Q23-123","count"=>14,"User"=>"P.Williams");
$result = array_walk( $test, "empty", true );

我得到的结果就是“数组”。

并且PHP解析器对它有一种合适的态度,他们在他们的网站上清楚地说bool array_walk ( array &$array , callable $callback [, mixed $userdata = NULL ] ),我推断这是$result array_walk ( $theTargetArray, "StringNameOfFunction", theResultIfTure);,但没有什么是那么简单。

到目前为止,我已在很多网站上找到了很多示例,似乎人们刚刚复制并粘贴了PHP示例,有些人更改了名称以隐藏他们复制并粘贴了示例......

有人能让我知道我在这里做错了吗?

(也是粮农组织stackoverflow网站维护者,建议标签有什么意义,我点击使用它然后我被告知我不能创建一个新标签,除非我有1500点???严重为什么?好主意如果你去考虑一下。)

3 个答案:

答案 0 :(得分:2)

$my_arr = array(....);    // your array here
$has_empty_value = sizeof($my_arr) != sizeof(array_filter($my_arr));

答案 1 :(得分:1)

array_walk不会帮助你。它是一个mutator函数,旨在更改数组元素,而不是检索有关它们的信息。您正在寻找的是一种布尔聚合函数,在其他语言中称为anysome。 PHP没有提供开箱即用的功能,因此您必须手动编写它:

function any($iter, $pred) {
    foreach($iter as $item)
        if($pred($item))
            return true;
    return false;
}

但是,尝试将其与empty一起使用,如

print any($test, 'empty')

会失败,因为empty不是真正的功能,不能间接使用。解决方法是将其包装在另一个函数中,并将其传递给any

any($test, function($x) { return empty($x); })

另一个选择是通过boolval过滤数组,从而删除" falsy"值,并比较长度:

$hasEmptyElements = count(array_filter($test, 'boolval')) < count($test);

请注意,与any不同,这是&#34;懒惰&#34;,filter始终处理整个数组。

答案 2 :(得分:0)

array_walk的{​​{3}}说“将用户定义的回调函数应用于数组数组的每个元素。”因此,您可以将它与您自己的回调一起使用,也可以与闭包一起使用,如下所示:

$test = array("Tree"=>"Ash","TreeID"=>"Q23-123", "count"=> 14, "User"=>"P.Williams");
    $result = array_walk( $test, function($value) {
        return empty($value);
    });

当然,这取决于您要实现的目标,因为这将循环遍历所有值,如果所有值都为空但最后一个值不为,则$result将为true。< / p>

如果您要查找是否有任何值为空,则在找到空项后停止的函数会更好:

function hasEmptyValues(array $array)
{
    foreach ($array as $key => $value) {
        if (empty($value)) {
            //Empty value found
            return true;
        }
    }
    //None of the values are empty
    return false;
}