Как вы проверяете массив, содержащий только значения, которые являются целыми числами?
Я хотел бы иметь возможность проверить массив и получить логическое значение true
если массив содержит только целые числа и false
если в массиве есть другие символы. Я знаю, что могу перебирать массив и проверять каждый элемент отдельно и возвращать true
или false
зависимости от наличия нечисловых данных:
Например:
$only_integers = array(1,2,3,4,5,6,7,8,9,10); $letters_and_numbers = array('a',1,'b',2,'c',3); function arrayHasOnlyInts($array) { foreach ($array as $value) { if (!is_int($value)) // there are several ways to do this { return false; } } return true; } $has_only_ints = arrayHasOnlyInts($only_integers ); // true $has_only_ints = arrayHasOnlyInts($letters_and_numbers ); // false
Но есть ли более сжатый способ сделать это, используя встроенные функции PHP, о которых я не думал?
Примечание. Для моей текущей задачи мне нужно будет только проверить одномерные массивы. Но если есть решение, которое работает рекурсивно, я был бы благодарен за это.
$only_integers === array_filter($only_integers, 'is_int'); // true $letters_and_numbers === array_filter($letters_and_numbers, 'is_int'); // false
Это поможет вам в будущем определить две вспомогательные функции высшего порядка:
/** * Tell whether all members of $array validate the $predicate. * * all(array(1, 2, 3), 'is_int'); -> true * all(array(1, 2, 'a'), 'is_int'); -> false */ function all($array, $predicate) { return array_filter($array, $predicate) === $array; } /** * Tell whether any member of $array validates the $predicate. * * any(array(1, 'a', 'b'), 'is_int'); -> true * any(array('a', 'b', 'c'), 'is_int'); -> false */ function any($array, $predicate) { return array_filter($array, $predicate) !== array(); }
<?php $only_integers = array(1,2,3,4,5,6,7,8,9,10); $letters_and_numbers = array('a',1,'b',2,'c',3); function arrayHasOnlyInts($array){ $test = implode('',$array); return is_numeric($test); } echo "numbers:". $has_only_ints = arrayHasOnlyInts($only_integers )."<br />"; // true echo "letters:". $has_only_ints = arrayHasOnlyInts($letters_and_numbers )."<br />"; // false echo 'goodbye'; ?>
Другая альтернатива, хотя, вероятно, медленнее других решений, размещенных здесь:
function arrayHasOnlyInts($arr) { $nonints = preg_grep('/\D/', $arr); // returns array of elements with non-ints return(count($nonints) == 0); // if array has 0 elements, there's no non-ints }
Всегда есть array_reduce ():
array_reduce($array, function($a, $b) { return $a && is_int($b); }, true);
Но я бы предпочел самое быстрое решение (именно то, что вы поставили) по наиболее кратким.
function arrayHasOnlyInts($array) { return array_reduce( $array, function($result,$element) { return is_null($result) || $result && is_int($element); } ); }
возвращает true, если массив имеет только целые числа, false, если хотя бы один элемент не является целым числом, а null, если массив пуст .
Почему бы нам не пойти на Исключения?
Возьмите любую встроенную функцию массива, которая принимает обратный вызов пользователя ( array_filter()
, array_walk()
, даже функции сортировки, такие как usort()
и т. Д.) И генерируют исключение в usort()
. Например, для многомерных массивов:
function arrayHasOnlyInts($array) { if ( ! count($array)) { return false; } try { array_walk_recursive($array, function ($value) { if ( ! is_int($value)) { throw new InvalidArgumentException('Not int'); } return true; }); } catch (InvalidArgumentException $e) { return false; } return true; }
Это, конечно, не самый лаконичный, но универсальный способ.