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

Joh*_*nde 26 php arrays

如何验证数组是否只包含整数值?

我希望能够检查数组并最终得到一个布尔值,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
Run Code Online (Sandbox Code Playgroud)

但是有没有更简洁的方法来使用我没想过的本机PHP功能呢?

注意:对于我当前的任务,我只需要验证一维数组.但如果有一个递归工作的解决方案,我会很感激地看到它.

Ion*_*tan 56

$only_integers       === array_filter($only_integers,       'is_int'); // true
$letters_and_numbers === array_filter($letters_and_numbers, 'is_int'); // false
Run Code Online (Sandbox Code Playgroud)

它将在未来帮助您定义两个辅助,更高阶函数:

/**
 * 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 当PHP在参数顺序中不一致时会发生这种情况.... (8认同)

mcg*_*ilm 7

 <?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';
 ?>
Run Code Online (Sandbox Code Playgroud)

  • +1表示简单的解决方案,但这不适用于大型数组. (3认同)

bco*_*sca 5

function arrayHasOnlyInts($array) {
    return array_reduce(
        $array,
        function($result,$element) {
            return is_null($result) || $result && is_int($element);
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

如果数组仅包含整数,则返回 true;如果至少一个元素不是整数,则返回 false;如果数组为空,则返回 null


Mat*_*hew 5

总是有array_reduce():

array_reduce($array, function($a, $b) { return $a && is_int($b); }, true);
Run Code Online (Sandbox Code Playgroud)

但我最喜欢最简洁的解决方案(这是你提供的).

  • 具有1M整数记录的数组的快速基准.foreach:1.09s,减少:0.88s,为:0.64s.将第5条记录更新为非整数后... foreach:0.59s,reduce:0.54s,for:0.0s.因此,要获得最佳性能,请使用for循环替换foreach(并使用常量`$ c = count($ array)`).你的旅费可能会改变. (2认同)

Mar*_*c B 5

另一种选择,虽然可能比这里发布的其他解决方案慢:

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
}
Run Code Online (Sandbox Code Playgroud)