提供された関数がそれらすべてに対して true を返した場合に true を返す、配列を与えることができる関数はありますか?
theFunction(array(1,2,3) , 'is_numeric') //true
theFunction(array(1,"b",3) , 'is_numeric') //false
提供された関数がそれらすべてに対して true を返した場合に true を返す、配列を与えることができる関数はありますか?
theFunction(array(1,2,3) , 'is_numeric') //true
theFunction(array(1,"b",3) , 'is_numeric') //false
いいえ、しかし使用できます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
array_filter()
仕事をします:
$data = array(1, 2, 3);
if ($data === array_filter($data, 'is_numeric'))
{
// all values of $data are numeric
}
/**
* 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;
}
これは、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
効率を気にせず、シンプルさを重視する場合は、新しい関数を作成することなくmin
andを使用できます。array_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
これは、検証ルールに対して値を検証するか、呼び出し可能オブジェクト (PHP 関数またはクロージャーの名前) を使用するための関数です。
/**
* 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 <petrofimov@yandex.ru>
*/
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;
}
プロジェクトマッチメーカーに実装された、準備された一連の検証ルールで使用できます: https://github.com/ptrofimov/matchmaker