2012-07-10 120 views
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?

UPDATE 我忘了补充一点,数字可以表示为字符串

+2

循环遍历每个数组,并确保它们从0开始并按照算术级数进行循环? – mellamokb 2012-07-10 21:07:17

+1

所以键和变量都是相同的,有一个计划 – 2012-07-10 21:08:31

+0

是的,他们必须是相同的,但可以表示为数字或字符串,我更关注性能和内存使用情况,因为阵列的每个元素不受限制长度 – Nazariy 2012-07-10 21:15:39

回答

8

比较它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 
+1

如何实例化新的数组与“范围”为每个数组项“最有效的方法”? – mellamokb 2012-07-10 21:09:45

+0

他并没有遍历任何类型的循环,这只是我能想到的其他方式。 – 2012-07-10 21:15:50

+0

'1000000'循环中的任意测试 - '0m2.418s'(我的)与'0m2.873s'(循环)。做你会做的。 – Jay 2012-07-10 21:18:37

3
array_map(function($inner){ 
    foreach(array_values($inner) as $key => $value){ 
     if($key != $value)return "WRONG"; 
    } 
    return "VALID"; 
},$array) 
1

尝试:

for ($i = 0; $i < count($array); ++$i) { 
    if($array[$i] != $i){ 
     //invalid 
    } 
} 
//valid 
0

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

$valid = true; 
foreach ($array as &$inner) { 
     $i = -1; 
     foreach ($inner as $key => $value) { 
      if ((++$i != $key) || ($key != $value)) { 
       $valid = false; 
       break 2; 
      } 
     } 
}