2012-07-10 62 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; 
      } 
     } 
} 
相關問題