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

Php 更简洁的检查数组是否只包含数字(整数)的方法,php,arrays,Php,Arrays,如何验证数组只包含整数值 我希望能够检查一个数组,如果该数组只包含整数,则结果为布尔值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($arra

如何验证数组只包含整数值

我希望能够检查一个数组,如果该数组只包含整数,则结果为布尔值
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();
}

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

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


 <?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\u filter()
array\u 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;
}

这当然不是最简洁的,但却是一种多功能的方式。

+1是一种简单的解决方案,但这对大型数组不起作用。如果introde()生成的整数大于服务器的max int值,它将失败。你不会碰巧知道默认值是多少吧?@mcgrailm:我知道这篇文章已经有4年了,但这可能对未来的游客有所帮助。这是
PHP\u INT\u MAX
@AmalMurali你的意思不是数字而是数字吗?问题是,如果没有基准测试,你怎么知道哪一个最快?OP的代码通过在任何元素不是整数时返回false来缩短迭代。建议的其余解决方案迭代整个数组。即使传递了数组,此解决方案也会返回trueempty@konforce:
var\u dump(array\u reduce(array(),函数($a,$b){return$a&&is\u int($b);},true);)
result:
bool(true)
这是因为您提供了第三个参数。一个包含1M整数记录的数组的快速基准测试。foreach:1.09s,reduce:0.88s,for:0.64s。将第5条记录更新为非整数后。。。foreach:0.59s,reduce:0.54s,for:0.0s。因此,为了获得最佳性能,用for循环替换foreach(并使用常量
$c=count($array)
)。你的里程可能会有所不同。只是想确保我在这里没有发疯。$predicate,$array不应该在array_filter()中反转吗?@John你是对的。这几天我使用了很多数组映射,因此出现了错误。应该是数组过滤器(array$input[,callback$callback])你能举个例子说明如何在没有函数的情况下使用这个条件吗,因为我无法使它工作:(谢谢:)“Any”表示“部分”(大于零)而不是“全部”如果值是整数但类型为字符串,则在answearWorks中实现,例如
“123”
。您可以将其简化为
$only_integers===preg_grep('/\d/',$only_integers);/正确
如@Ionut G.Stan的回答。但仅适用于正整数。-符号会破坏乐趣。它也适用于非整数吗<代码>数组('1','2','3')我不确定表单元素是否作为字符串发送。只需将is\u int替换为is\u字符串即可
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
}
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;
}