3

我有一个二维数组,其中包含必须使用以下规则验证的数字范围,范围应从 0 开始并遵循算术级数。

例如:

$array = array();
$array[] = array(0);//VALID
$array[] = array(0,1,2,3,4,5);//VALID
$array[] = array("0","1");//VALID
$array[] = array(0,1,3,4,5,6);//WRONG
$array[] = array(1,2,3,4,5);//WRONG
$array[] = array(0,0,1,2,3,4);//WRONG

在 php 中最有效的方法是什么?

更新 我忘了添加数字可以表示为字符串

4

4 回答 4

9

比较它range($firstelt, $lastelt)

function isProgression($arr){
    return $arr == range(0, $arr[count($arr)-1]);
}

完全任意的基准:

function isProgression($array){
        return ($array == range(0, $array[sizeof($array)-1]));
}

function isProgression2($array){
    $count = count($array);
    for ($i = 0; $i < $count; ++$i) {
        if($array[$i] != $i){
             return true;
        }
    }
    return false;
}

for ($x = 0; $x < 1000000; $x++) {
        // Pick one
        isProgression(array(0,1,2,3,4,5));
        isProgression2(array(0,1,2,3,4,5));
}

结果:

isProgression:   0m2.345s
isProgression2:  0m1.906s
于 2012-07-10T21:07:27.337 回答
3
array_map(function($inner){
    foreach(array_values($inner) as $key => $value){
        if($key != $value)return "WRONG";
    }
    return "VALID";
},$array)
于 2012-07-10T21:08:33.180 回答
1

尝试:

for ($i = 0; $i < count($array); ++$i) {
    if($array[$i] != $i){
        //invalid
    }
}
//valid
于 2012-07-10T21:13:25.460 回答
0

通过引用传递数组对于小型数组可能不是最佳的。

 $valid = true;
 foreach ($array as &$inner) {
      $i = -1;
      foreach ($inner as $key => $value) {
           if ((++$i != $key) || ($key != $value)) {
                $valid = false;
                break 2;
           }
      }
 }
于 2012-07-10T21:15:05.390 回答