是否可以使用array_map()来测试数组的值?我想确保数组的所有元素都是数字。
我试过了两次
$arrays = array(
array(0,1,2,3 )
, array ( 0,1, "a", 5 )
);
foreach ( $arrays as $arr ) {
if ( array_map("is_numeric", $arr) === FALSE ) {
echo "FALSE\n";
} else {
echo "TRUE\n";
}
}
和
$arrays = array(
array(0,1,2,3 )
, array ( 0,1, "a", 5 )
);
foreach ( $arrays as $arr ) {
if ( ( array_map("is_numeric", $arr) ) === FALSE ) {
echo "FALSE\n";
} else {
echo "TRUE\n";
}
}
两者都得到了
TRUE
TRUE
可以这样做吗?如果是这样,我做错了什么?
注意:我知道我可以从foreach循环中获得所需的功能。
答案 0 :(得分:4)
array_map返回一个数组。所以它总是被认为是“真实的”。现在,如果你array_search
为假,你可能会得到欲望效果。
array_map() returns an array containing all the elements of
arr1 after applying the callback function to each one.
这意味着您目前拥有一个包含每个元素的true或false的数组。您需要使用array_search(false,$array)
来确定是否存在任何错误值。
答案 1 :(得分:2)
我通常是array_map()
,array_filter()
等的大力倡导者,但在这种情况下,foreach()
将是最佳选择。原因是,array_map()
和其他人无论如何都会经历整个阵列。但是出于您的目的,您只需要遍历数组,直到遇到is_numeric()
返回false的值,据我所知,PHP中没有办法打破这些方法。
换句话说,如果您的数组中有1,000个项目而第5个项目不是数字,则使用array_map()
仍将检查剩余的995值,即使您已经知道阵列未通过测试。但是如果您使用foreach()而在break
上使用is_numeric() == false
,那么您只需要检查前五个元素。
答案 2 :(得分:1)
您可以使用过滤器,但最终会出现一些可怕的代码
$isAllNumeric = count(array_filter($arr, "is_numeric")) === count($arr)
使用自定义功能可以让它更好一点,但仍然不完美
$isAllNumeric = count(array_filter($arr, function($x){return !is_numeric($x);})) === 0
但是如果你使用自定义函数,array_reduce会起作用,但它仍有一些失败。
$isAllNumeric = array_reduce($arr,
function($x, $y){ return $x && is_numeric($y); },
true);
缺点是当它找到它想要的东西时它不会破坏,所以上面的功能性建议效率不高。你需要写一个这样的函数:
function array_find(array $array, $callback){
foreach ($array as $x){ //using iteration as PHP fails at recursion
if ( call_user_func($callback, array($x)) ){
return $x;
}
}
return false;
}
并像这样使用
$isAllNumeric = array_find($arr, function($x){return !is_numeric($x);})) !== false;
答案 3 :(得分:1)
我的“标准库”中有两个很小但非常有用的功能
function any($ary, $func) {
foreach($ary as $val)
if(call_user_func($func, $val)) return true;
return false;
}
function all($ary, $func) {
foreach($ary as $val)
if(!call_user_func($func, $val)) return false;
return true;
}
在你的例子中
foreach ( $arrays as $arr )
echo all($arr, 'is_numeric') ? "ok" : "not ok";
答案 4 :(得分:0)
更优雅的方法恕我直言:
foreach ($arrays as $array)
{
if (array_product(array_map('is_numeric', $array)) == true)
{
echo "TRUE\n";
}
else
{
echo "FALSE\n";
}
}
如果所有值都是数字,则返回true;如果任何值不是数值,则返回false。