1

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

4

5 回答 5

4

array_map 返回一个数组。所以它总是被认为是“真实的”。现在,如果你array_search为 FALSE,你也许可以得到想要的效果。

来自PHP.net 页面

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)来找出是否有任何错误值。

于 2009-12-16T16:00:10.923 回答
2

我通常是 , 等的大力倡导者array_map()array_filter()但在这种情况下foreach()将是最佳选择。原因是 witharray_map()和 others 无论如何都会遍历整个数组。但是出于您的目的,您只需要遍历数组,直到遇到is_numeric()返回 false 的值,据我所知,PHP 无法摆脱这些方法。

换句话说,如果您的数组中有 1,000 个项目并且第 5 个不是数字,array_map()即使您已经知道该数组没有通过您的测试, using 仍然会检查剩余的 995 个值。但是,如果您使用 foreach() 并将其设置为breakon is_numeric() == false,那么您只需要检查前五个元素。

于 2009-12-16T16:07:20.207 回答
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;
于 2009-12-16T16:03:47.433 回答
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";
于 2009-12-16T16:31:05.480 回答
0

一种更优雅的方法恕我直言

foreach ($arrays as $array)
{
 if (array_product(array_map('is_numeric', $array)) == true)
 {
  echo "TRUE\n";
 }

 else
 {
  echo "FALSE\n";
 }
}

如果所有值都是数字,这将返回 true,如果任何值不是数字,则返回 false。

于 2009-12-16T17:47:13.063 回答