2016-11-16 48 views
0

我有一個看起來像這樣的數組:PHP使用數組找到範圍和失蹤數字

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

[1] => Array 
    (
     [1] => 6 
     [2] => 5 
     [4] => 3 
     [5] => 2 
     [6] => 1 
     [8] => 3 
     [9] => 4 
     [10] => 5 
     [11] => 6 
    ) 

[2] => Array 
    (
     [1] => 7 
     [2] => 6 
     [3] => 5 
     [4] => 4 
     [5] => 3 
     [6] => 2 
     [7] => 3 
     [8] => 4 
     [11] => 7 
    ) 

我操作我試圖去通過的順序,我真的不知道從這往哪兒走。任何建議都會有很大的幫助。

  1. 首先,我給我的班級我想要返回的項目數。例如,我們將使用4.

  2. 我想遍歷並找到數組中具有最低值的項目。

  3. 我想在關鍵的項目環顧四周(它包括了),並確保他們不會錯過了一些,如果他們are..reject吧..

在這個例子中,第一個你會來:

[5] => 1 

現在環顧四周,你會發現鍵是缺少一些數字。所以沒有4的組合會得到匹配順序任何4。

[1] => 5 
    [2] => 4 
    [3] => 3 
    [5] => 1 //this one 
    [7] => 1 
    [8] => 2 
    [9] => 3 

在這種情況下,我希望它進入下一個案例。

[7] => 1 

注意這一個將工作,因爲鍵是7,8,9,10。

[7] => 1 
    [8] => 2 
    [9] => 3 
    [10] => 4 

這就是我想要返回的第一..但我甚至不知道如何開始到那裏。

此外還有類似這樣的情況。例如,數據集中根本沒有1,最後一個只有這2個。

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

[1] => Array 
    (
     [1] => 6 
     [2] => 5 
     [4] => 3 
     [5] => 3 
     [6] => 3 
     [8] => 3 
     [9] => 4 
     [10] => 5 
     [11] => 6 
    ) 

[2] => Array 
    (
     [1] => 7 
     [2] => 6 
     [5] => 3 
     [6] => 2 // this one 
     [7] => 3 
     [8] => 4 
     [11] => 7 
    ) 

下無法正常工作:

[6] => 2 // this one 
    [7] => 3 
    [8] => 4 
    [11] => 7 

但是這一次將:

 [5] => 3 
     [6] => 2 // this one 
     [7] => 3 
     [8] => 4 

我對如何處理這個。如果有人可以提供一些建議,它會不知道非常感謝。非常感謝提前。

+0

不清楚你所說的 「缺少了一些」 - 在你的榜樣,' [6]'也缺少,但'[7]'被接受。假設它即將接受,比如'[7]',那麼下面的x必須存在? –

+0

是的!如果它接受7.然後,我想要4,5,6存在..或5,6,8 ..或8,9,10 ...因爲我的初始輸入只是尋找4. –

回答

1

以下內容假定您的數據位於名爲$data的數組中。我會逐步描述它,然後將它們作爲一個函數集中在一起。

步驟1找到最小值:

$minValue=min($data); 

步驟2遍歷陣列尋找所有的值是該值:

foreach($data as $index => $value){ 

    if($value == $minValue){ 
     // $index is a candidate! 
    } 
} 

步驟3檢查$valuesToReturn條目存在索引後:

$success=true; 

    for($i=1;$i<=$valuesToReturn;$i++){ 

     if(!array_key_exists($index + $i,$data)){ 

      // Candidate failed. 
      $success=false; 
      break; 

     } 

    } 

步驟4如果候選人成功了,請將其退回。

if($success){ 
     return $index; 
    } 

把所有在一起,我們得到這樣的:

function findSuitableIndex($data,$valuesToReturn){ 

    // Min: 
    $minValue=min($data); 

    foreach($data as $index => $value){ 

     if($value == $minValue){ 
      // $index is a candidate! 

      // test if index is actually suitable: 
      $success=true; 

      for($i=1;$i<=$valuesToReturn;$i++){ 

       if(!array_key_exists($index + $i,$data)){ 

        // Candidate failed. 
        $success=false; 
        break; 

       } 

      } 

      if($success){ 
       return $index; 
      } 

     } 

    } 

    // If we fell down here, we failed to find any successful results. 
    return -1; 
} 

工作樣本:

Code on eval.in

+0

WOW !你是我的英雄!!!!現在我只需要使它返回數組中的工作4結果。我建議大家現在都贊成這個,因爲它非常完美。非常感謝! –

+1

@JoelHasSimpleQuestions沒問題!我只是很快重新閱讀這個問題,所以有一件事可能會引起你的注意:如果$ valuesToReturn是4,那麼它會檢查'候選'索引後面的4個條目。如果你只希望它檢查下面的內容,那麼將'$ i <= $ valuesToReturn'更改爲'$ i <$ valuesToReturn' 3 :)要返回一個數組,最簡單的方法是複製/粘貼相同的循環並執行例如'$ result [] = $ data [$ index + $ i];' –

+1

@JoelHasSimpleQuestions我個人的選擇是在一個單獨的函數中做最後一部分 - 這樣,只要索引有用,就可以得到索引。 –

0

以下是一些建議。您的具體實施取決於您的具體情況。

要遍歷數組中的每個元素,可以使用foreach循環。

foreach ($arr[0] as $index => $value) { 
    // Here, $arr[0][$index] == $value; 

} 

要檢查密鑰是否存在,可以使用array_key_exists

if (!array_key_exists($index - 1, $arr[0])) { 
    // The previous index is missing in the array. 

} 

一個簡單的(但低效的)的方式找到的k指數與第一索引處的最小值的連續序列是找到最小的元素,並檢查該連續序列的存在;如果沒有,找到下一個最小的元素並遞歸檢查,直到完成處理最大的元素。

您也可以嘗試查找至少長度爲k的所有連續序列,然後在第一個索引處選擇具有最小值的序列。

希望這會有所幫助!