2012-11-22 16 views
0

我有幫助,一個令人難以置信的怪異要求在這裏,讓我嘗試儘可能地解釋一下:校驗陣列的序列值

我有一個項目數組(我散列的文本作爲文本ISN 「T重要的是,它是長度我將使用)

Array 
(
    [0] => ## 
    [1] => ### 
    [2] => ### 
    [3] => ### 
    [4] => #### 
    [5] => ### 
    [6] => #### 
    [7] => ##### 
    [8] => ## 
    [9] => ### 
) 

我需要檢查是爲了確保每個值的長度比前一個元素的長度時,不超過1 。他們可以減少長度超過1,但他們不能增加超過1的長度。上述陣列根據這些規則是有效的。

但是,下面的數組將是錯誤的(請參閱元素4的長度是2如何大於3)。

Array 
(
    [0] => ## 
    [1] => ### 
    [2] => ### 
    [3] => ### 
    [4] => ##### 
    [5] => ### 
    [6] => #### 
    [7] => ##### 
    [8] => ## 
    [9] => ### 
) 

這是我到目前爲止有:

<?php 
$array = array('##','###','###','###','####','###','####','#####','##','###'); // Valid Array 
$array = array('##','###','###','###','#####','###','####','#####','##','###'); // Invalid Array 
$tmp = 0; 
$i = 0; 
$valid = true; 
foreach($array as $k => $v) { 
    if($i>0&&strlen($v)>$tmp&&strlen($v)>($tmp+1)) { 
     $valid = false; 
    } 
    $tmp = strlen($v); 
    $i++; 
} 
echo ($valid) ? 'Array is valid' : 'Array is invalid'; 
?> 

它的工作原理,但它是凌亂如地獄,我不喜歡它在所有,任何人有一個更好的方式任何其他建議檢查這個?

回答

2
for($i = 1; $i < count($array); $i++) { 
    if((strlen($array[$i - 1]) - strlen($array[$i])) > 1) { 
    $valid = false; 
    break; 
    } 
} 

通知循環1開始,以避免在$i = 0

+0

小心用'abs',OP表示,負差可以' > 1'。 – moonwave99

+0

雖然這是稍微更清潔,但它也會返回錯誤,當它減少超過1,這是允許的。 –

+0

修正了負面的差異,thx – jaudette

2

具有-1指數,我不認爲你可以沒有比這更好的 - 你可以只是包裝一切的可重用性的目的功能:

function checkArray($array) 
{ 

    foreach($array as $i => $v) 
    { 

    if($i==0) 
     continue; 

    if((strlen($v) - strlen($array[$i-1])) > 1){ 
     return false; 
    } 

    } 

    return true; 

} 
+0

謝謝。我同意在一個函數中使用它會很好,所以一旦它發現它是無效的就停止。我將接受@ jaudette的答案,因爲它使用了for外觀,並且都訪問$ array而不是$ v。永遠不會知道,鑰匙可能會變得有點混亂。儘管謝謝你的幫助:) –

1

關閉我的頭頂,我的循環可能更改爲:

foreach ($array as $k => $v) { 
    if ($k == 0) { 
     continue; 
    } 
    if ((strlen($v) - strlen($array[$k - 1])) > 1) { 
     $valid = false; 
     break; 
    } 
} 

也許最好把它粘在一個函數中。 編輯 - 與moonwave99完全相同。

1

使用current()each()允許與任何形式的鍵陣列,並且不依賴於第一關鍵是0。

function arr_is_valid(array $arr) { 
     $last_len = strlen(current($arr)); 
     while (list($k,$v) = each($arr) { 
      $cur_len = strlen($v); 
      if(1 < $cur_len - $last_len) return false; 
      $last_len = $cur_len; 
     } 
     return true; 
    } 

$valid = arr_is_valid($my_array);