使用array_map测试值?

时间:2009-12-16 15:58:04

标签: php array-map

是否可以使用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循环中获得所需的功能。

5 个答案:

答案 0 :(得分:4)

array_map返回一个数组。所以它总是被认为是“真实的”。现在,如果你array_search为假,你可能会得到欲望效果。

来自PHP.net Page

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。