时有可能使用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循环得到我想要的功能。

有帮助吗?

解决方案

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.

这意味着,目前必须包含真或假的每个元素的数组。你可能会需要使用array_search(false,$array),以找出是否有任何虚假的值。

其他提示

我通常array_map()array_filter()等大的倡导者,但在这种情况下foreach()将是最好的选择。其原因是,与array_map()和其他它会经过整个阵列不管。但是,对于你的目的,你只需要通过该阵列,直到你遇到了哪些is_numeric()返回false值,而据我所知有一个在PHP没有办法摆脱这些方法。

在换句话说,如果你有你的数组中的1000项和第5一个不是数字,用array_map()仍会检查,即使你已经知道数组没有通过测试,其余995个值。但是,如果你使用foreach()来代替,而有它breakis_numeric() == false,那么你只需要检查那些最初的五个要素。

您可以使用过滤器,但它有一个代码可怕位

结束
$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;

我有两个微小的,但非常有用的功能在我的“标准库”

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";

:一种更好的方法IMHO

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

 else
 {
  echo "FALSE\n";
 }
}

如果所有的值是数值和假如果任何值不是数值这将返回true。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top