PHP функция для проверки массива - PullRequest
3 голосов
/ 08 августа 2010

Есть ли функция, которую я мог бы дать массив, который возвратил бы true, если бы предоставленная функция вернула true для всех из них?

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

Ответы [ 5 ]

5 голосов
/ 08 августа 2010

Нет, но вы можете использовать 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
4 голосов
/ 14 сентября 2011

array_filter() выполняет работу:

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

if ($data === array_filter($data, 'is_numeric'))
{
    // all values of $data are numeric
}
2 голосов
/ 08 августа 2010

Если вы не заботитесь об эффективности и больше заботитесь о простоте, вы можете использовать min и 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
2 голосов
/ 08 августа 2010
 /**
  * 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;
 }

Это взято из моей реализации перечисления Руби

Вы можете назвать это как:

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
0 голосов
/ 28 июня 2014

Это функция для проверки значения по правилам проверки или просто для использования вызываемых элементов: имен функций 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;
}

Вы можете использовать его с подготовленным набором правил проверки, реализованных в проекте matchmaker: https://github.com/ptrofimov/matchmaker

...