php 检查数组是否只包含数字(整数)的更简洁方法

slwdgvem  于 2022-12-02  发布在  PHP
关注(0)|答案(6)|浏览(154)

如何验证数组只包含整数值?
我希望能够检查一个数组,如果数组中只包含整数,则得到一个布尔值true,如果数组中包含其他字符,则得到false。我知道我可以循环遍历数组,逐个检查每个元素,并根据是否存在非数字数据返回truefalse
例如:

$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功能来实现这一点?
注意:对于我目前的任务,我只需要验证一维数组。但是如果有一个递归的解决方案,我会很感激看到。

3npbholx

3npbholx1#

$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 $elems validate the $predicate.
 *
 * all(array(), 'is_int')           -> true
 * all(array(1, 2, 3),   'is_int'); -> true
 * all(array(1, 2, 'a'), 'is_int'); -> false
 */
function all($elems, $predicate) {
  foreach ($elems as $elem) {
    if (!call_user_func($predicate, $elem)) {
      return false;
    }
  }

  return true;
}

/**
 * Tell whether any member of $elems validates the $predicate.
 *
 * any(array(), 'is_int')               -> false
 * any(array('a', 'b', 'c'), 'is_int'); -> false
 * any(array(1, 'a', 'b'),   'is_int'); -> true
 */
function any($elems, $predicate) {
  foreach ($elems as $elem) {
    if (call_user_func($predicate, $elem)) {
      return true;
    }
  }

  return false;
}
8wigbo56

8wigbo562#

<?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';
 ?>
lb3vh1jj

lb3vh1jj3#

另一个替代方案,虽然可能比其他解决方案慢,张贴在这里:

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
}
rnmwe5a2

rnmwe5a24#

array_reduce()函数的作用是:

array_reduce($array, function($a, $b) { return $a && is_int($b); }, true);

但我更喜欢最快的解决方案(这是你提供的)而不是最简洁的。

zazmityj

zazmityj5#

function arrayHasOnlyInts($array) {
    return array_reduce(
        $array,
        function($result,$element) {
            return is_null($result) || $result && is_int($element);
        }
    );
}

如果array只有整数,则返回true;如果至少有一个元素不是整数,则返回false;如果array为空,则返回null

93ze6v8z

93ze6v8z6#

为什么我们不给予“例外”呢?
接受任何接受用户回调的内置数组函数(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;
}

这当然不是最简洁的,但却是一种通用的方式。

相关问题