Intereting Posts

Более сжатый способ проверить, содержит ли массив только числа (целые числа)

Как вы проверяете массив, содержащий только значения, которые являются целыми числами?

Я хотел бы иметь возможность проверить массив и получить логическое значение 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; } 

Это, конечно, не самый лаконичный, но универсальный способ.