Более сжатый способ проверить, содержит ли массив только числа (целые числа)
Как вы проверяете, что массив содержит только значения, которые являются целыми числами?
Я хотел бы иметь возможность проверять массив и заканчивать логическим значением 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, о которой я не думал?
Примечание. Для моей текущей задачи мне нужно будет только проверить одномерные массивы. Но если есть решение, которое работает рекурсивно, я был бы благодарен за это.
Ответы
Ответ 1
$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();
}
Ответ 2
<?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';
?>
Ответ 3
Другая альтернатива, хотя, вероятно, медленнее других решений, размещенных здесь:
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 no non-ints
}
Ответ 4
function arrayHasOnlyInts($array) {
return array_reduce(
$array,
function($result,$element) {
return is_null($result) || $result && is_int($element);
}
);
}
возвращает true, если массив имеет только целые числа, false, если хотя бы один элемент не является целым числом, а null, если массив пуст.
Ответ 5
Всегда всегда array_reduce():
array_reduce($array, function($a, $b) { return $a && is_int($b); }, true);
Но я бы предпочел самое быстрое решение (это то, что вы поставили) по наиболее кратким.
Ответ 6
Почему бы нам не пойти на Исключения?
Возьмите любую встроенную функцию массива, которая принимает обратный вызов пользователя (array_filter()
, array_walk()
, даже функции сортировки, такие как 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;
}
Это, конечно, не самый краткий, но универсальный способ.