2010-08-08 61 views
3

是否有一个函数可以给一个数组,如果提供的函数对所有数组都返回true,那么这个函数会返回true?PHP函数验证数组

theFunction(array(1,2,3) , 'is_numeric') //true 
theFunction(array(1,"b",3) , 'is_numeric') //false 

回答

5

没有,但你可以使用array_reduce

array_reduce(array(1,2,3), 
    function ($a, $v) { return $a && is_numeric($v); }, true); 

当然你也可以建立自己的高阶函数:

function for_all(array $arr, $func) { 
    return array_reduce($arr, 
     function ($a, $v) use ($func) { 
      return $a && call_user_func($func, $v); 
     }, true); 
} 

var_dump(
    for_all(array(1,2,3), 'is_numeric') 
); //true 
+0

是你的头像默认的值之一:

/** * Returns true if $value matches $pattern * * @param $value * @param string $pattern * * @return bool * * @see https://github.com/ptrofimov/matchmaker - ultra-fresh PHP matching functions * @author Petr Trofimov <[email protected]> */ function matcher($value, $pattern) { $args = []; if (($p = ltrim($pattern, ':')) != $pattern) foreach (explode(' ', $p) as $name) { if (substr($name, -1) == ')') { list($name, $args) = explode('(', $name); $args = explode(',', rtrim($args, ')')); } if (is_callable(rules($name))) { if (!call_user_func_array(rules($name), array_merge([$value], $args))) { return false; } } elseif (rules($name) !== $value) { return false; } } else { return $pattern === '' || $value === $pattern; } return true; } 

您可以准备一套验证规则,在项目实施的媒人使用它? – quantumSoup 2010-08-08 00:49:41

+0

@quantum是的。我习惯了。 – Artefacto 2010-08-08 00:50:40

+1

兼容性说明:匿名函数只适用于PHP> = 5.3.0 – quantumSoup 2010-08-08 00:52:37

2
/** 
    * all in collection? 
    * 
    * Passes each element of the collection to the given function. The method 
    * returns true if the function never returns false or null. 
    * 
    * If the function is not given, an implicit 
    * function ($v) { return ($v !== null && $v !== false) is added 
    * (that is all() will return true only if none of the collection members are false or null.) 
    * 
    * @param array $arr input array 
    * @param function $lambda takes an element, returns a bool (optional) 
    * @return boolean 
    */ 
function all($arr, $lambda=null) { 
    // these differ from PHP's "falsy" values 
    if (!is_callable($lambda)) { 
     foreach ($arr as $value) 
      if ($value === false || $value === null) 
       return false; 
    } else { 
     foreach ($arr as $value) 
      if (!call_user_func($lambda, $value)) 
       return false; 
    } 
    return true; 
} 

这是从my implementation解除Ruby的enum

你可以这样调用它:

var_dump(all($array, 'is_numeric')); 
var_dump(all($array, 'is_string')); 
var_dump(all($array, function($x) { return $x != 'fun';})); // PHP >= 5.3.0 
2

如果你不介意的效率和更关心简单,你可以使用minarray_map而无需创建新的功能。

(bool)min(array_map('is_numeric', array(1,2,3))); //true 
(bool)min(array_map('is_numeric', array(1,"b",3))); //false 

此外,如果你想想过程找到一个适合你可以把它改写了一下清洁模式。

!array_filter('is_not_numeric', array(1,2,3)); //true 
!array_filter('is_not_numeric', array(1,"b",3)); //true 
4

array_filter()这项工作:

$data = array(1, 2, 3); 

if ($data === array_filter($data, 'is_numeric')) 
{ 
    // all values of $data are numeric 
}