2014-06-25 52 views
0

我有一個關於在php數組中正確和快速查找的問題。有關在數組中正確和快速查找的問題

我輸入數組:

array (size=2) 
    0 => 
    array (size=7) 
     'Videos' => 
     array (size=2) 
      240 => 
      array (size=2) 
       ... 
      120 => 
      array (size=2) 
       ... 
     'Texts' => 
     array (size=0) 
      empty 
     'Price' => float 0 
     'QaAudio' => int 1 
     'QaVideo' => int 3 
     'Level' => string 'normal' (length=6) 
     'PreviewPic' => 
     array (size=7) 
      40 => 
      array (size=12) 
       ... 
      60 => 
      array (size=12) 
       ... 
      140 => 
      array (size=12) 
       ... 
      160 => 
      array (size=12) 
       ... 
      320 => 
      array (size=12) 
       ... 
      640 => 
      array (size=12) 
       ... 
      1024 => 
      array (size=12) 
       ... 
    1 => 
    array (size=7) 
     'Videos' => 
     array (size=3) 
      480 => 
      array (size=2) 
       ... 
      360 => 
      array (size=2) 
       ... 
      120 => 
      array (size=2) 
       ... 
     'Texts' => 
     array (size=0) 
      empty 
     'Price' => float 0 
     'QaAudio' => int 1 
     'QaVideo' => int 3 
     'Level' => string 'sexy' (length=4) 
     'PreviewPic' => 
     array (size=7) 
      40 => 
      array (size=12) 
       ... 
      60 => 
      array (size=12) 
       ... 
      140 => 
      array (size=12) 
       ... 
      160 => 
      array (size=12) 
       ... 
      320 => 
      array (size=12) 
       ... 
      640 => 
      array (size=12) 
       ... 
      1024 => 
      array (size=12) 
       ... 

我需要它來找到視頻,即在影片的關鍵最大值(它有360240120個值,你可以例子中看到的),有國家級重點是等於「正常」或「性感」的價值。

我寫了一些方法來做到這一點:

public function getPresentationVideo($id) 
    { 
     $result = []; 
     $notHardVideos = []; 
     $profileVideos = $this->getProfilesVideos($id,0,50); 
     if ($profileVideos && count($profileVideos) > 0) { 
      foreach ($profileVideos as $video) { 
       if (in_array($video['Level'],['normal','sexy'])) { 
        $video['maxVideoQuality'] = max(array_keys($video['Videos'])); 
        $notHardVideos[] = $video; 
       } 
      } 
      $keyForMaxQuality = 0; 
      if (count($notHardVideos) > 1) { 
       $maxQuality = 0; 
       foreach($notHardVideos as $key => $video) { 
        if($video['maxVideoQuality'] > $maxQuality) 
        { 
         $maxQuality = $video['maxVideoQuality']; 
         $keyForMaxQuality = $key; 
        } 
       } 
      } 
      if (count($notHardVideos) > 0) { 
       $result = $notHardVideos[$keyForMaxQuality]; 
       unset($result['maxVideoQuality']); 
      } 
     } 

     return $result; 
    } 

它做得很好。

但我不知道有沒有更有效的方法來做到這一點。 你有什麼想法嗎?

在此先感謝。

回答

1
$result = array_reduce($videos, function ($result, array $video) { 
    if (!in_array($video['Level'], ['normal', 'sexy'])) { 
     return $result; 
    } 
    if (!$result) { 
     return $video; 
    } 
    if (max(array_keys($video['Videos'])) > max(array_keys($result['Videos']))) { 
     return $video; 
    } 
    return $result; 
}); 

這將返回具有一個「正常」或「性感」級別的子陣列(順便說一句,FTW?!),並且具有在它的「畫」子陣列的最高鍵。它不包含任何其他注意事項,因爲您似乎在代碼中有這些注意事項,因爲您沒有具體說明這些注意事項。但是,您應該明白,如果需要,可以添加更多檢查。

有關此功能的幫助,請參見http://php.net/array_reduce。簡而言之,它會依次獲取數組中的每個元素,並將其與前一個最佳候選人進行比較。也就是說,$result一開始沒有任何問題,但是當你找到一個'正常'或'性感'的視頻時,它就會變成那個視頻,在隨後的調用中,具有較高鍵的視頻將會獲勝。

+0

非常感謝。好的解決方案 – user3193094