我有一个我要测试空元素的数组,我尝试使用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点???严重为什么?好主意如果你去考虑一下。)
答案 0 :(得分:2)
$my_arr = array(....); // your array here
$has_empty_value = sizeof($my_arr) != sizeof(array_filter($my_arr));
答案 1 :(得分:1)
array_walk
不会帮助你。它是一个mutator函数,旨在更改数组元素,而不是检索有关它们的信息。您正在寻找的是一种布尔聚合函数,在其他语言中称为any
或some
。 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;
}