Php 检查数组中的所有值是否为数字的最快方法是什么?

Php 检查数组中的所有值是否为数字的最快方法是什么?,php,arrays,Php,Arrays,我必须检查大数组,看看它们是否100%充满了数值。 我想到的唯一方法是foreach,然后每个值都是数字,但这是最快的方法吗?假设数组是一维的,并且只是由整数组成: return ctype_digit(implode('',$array)); 最快的方法可能是假设它们都是数字,然后继续操作。如果您的操作后来失败,那么您知道有些东西不是数字。但如果它们都是数字。。。你不可能比O(0)快得多 这个小函数对我来说很好 function IsNumericarr($arr){ if(!is_

我必须检查大数组,看看它们是否100%充满了数值。
我想到的唯一方法是foreach,然后每个值都是数字,但这是最快的方法吗?

假设数组是一维的,并且只是由整数组成:

return ctype_digit(implode('',$array));

最快的方法可能是假设它们都是数字,然后继续操作。如果您的操作后来失败,那么您知道有些东西不是数字。但如果它们都是数字。。。你不可能比O(0)快得多

这个小函数对我来说很好

function IsNumericarr($arr){
    if(!is_array($arr)){
        return false;
    }
    else{
        foreach($arr as $ar){
            if(!is_numeric($ar)){
                return false;
                exit;
            }
        }
        return true;
    }
}

需要循环

使用is\u数字筛选数组。如果结果的大小与原始结果相同,则所有项目都是数字:

array_map("is_numeric", array(1,2,"3","hello"))

Array ( [0] => 1 [1] => 1 [2] => 1 [3] => )
$array = array( 1, '2', '45' );
if ( count( $array ) === count( array_filter( $array, 'is_numeric' ) ) ) {
    // all numeric
}

我知道这个问题很老了,但我在我当前的一个项目中使用了Andy的方法,发现它是最可靠、最通用的解决方案,因为它适用于所有数值,负数、正数和十进制数

这是我写的一个平均值函数:

$array = [-10,1,2.1,3,4,5.5,6]; // sample numbers
function array_avg($arr) {
    if (is_array($arr) && count($arr) === count(array_filter($arr, 'is_numeric'))) {
        return array_sum($arr)/count($arr);
    } else {
        throw new Exception("non-numerical data detected");
    }
}
echo array_avg($array); // returns 1.6571428571429

此问题的任何解决方案都将在数组值上循环。您是否需要在代码或函数中完成这项工作是另一个问题,但在这两种情况下都有一个循环。所以我想性能应该差不多,不管你做什么。在值进入数组之前验证它们怎么样?这并不是那么简单,因为值以随机方式进入和离开数组,其中一些可以为null或false或“”,然后我必须用它们进行计算,如果数组中的某些数据不是数字,则这些计算的结果必须为null。如果必须撤消我的投票,
false
null
值,它们返回false作为
is\u numeric()
的值在这里内爆为空字符串,转义
ctype\u digit()
@BoltClock:OP确保数组是空的“100%充满数值”我认为内爆操作在时间上相当昂贵。@用户393087:如果你能支持你关于内爆昂贵的说法,你的“我认为”评论没有依据。真正的程序员说“我检查过了”“。这就是为什么基准测试是一门科学。但是一些非数字值会因为弱键入/自动播放而漏掉。”。该假设不安全。此答案因其长度和内容而自动标记为低质量。一个解释将帮助这个答案变得更像堆栈溢出答案。
$array = [-10,1,2.1,3,4,5.5,6]; // sample numbers
function array_avg($arr) {
    if (is_array($arr) && count($arr) === count(array_filter($arr, 'is_numeric'))) {
        return array_sum($arr)/count($arr);
    } else {
        throw new Exception("non-numerical data detected");
    }
}
echo array_avg($array); // returns 1.6571428571429