2014-09-19 88 views
0

我陣列表演的名字是這樣的:PHP數組排序兩次

$shows = array('morning_show_15_02_2014_part2.mp3', 
'morning_show_15_02_2014_part1.mp3', 
'morning_show_14_02_2014_part2.mp3', 
'morning_show_14_02_2014_part1.mp3', 
'morning_show_13_02_2014_part2.mp3', 
'morning_show_13_02_2014_part1.mp3'); 

所以名單看起來像: morning_show_15_02_2014_part2.mp3 morning_show_15_02_2014_part1.mp3 morning_show_14_02_2014_part2.mp3 morning_show_14_02_2014_part1.mp3 morning_show_13_02_2014_part2.mp3 morning_show_13_02_2014_part1.mp3

這是我所得到的,當我循環的目錄。

不過這個名單應該是這樣的: morning_show_15_02_2014_part1.mp3 morning_show_15_02_2014_part2.mp3 morning_show_14_02_2014_part1.mp3 morning_show_14_02_2014_part2.mp3 morning_show_13_02_2014_part1.mp3 morning_show_13_02_2014_part2.mp3 還是按日期排序,但是第1部分是第一,然後是第2部分

我怎麼能得到這個列表進入正確的順序?

謝謝你的幫助!

+1

你的問題是,你想通過日期降序和部分升序來訂購。唯一的機會就是在解析文件名的自定義排序函數中做到這一點。看看[usort](http://php.net/manual/en/function.usort.php) – SBH 2014-09-19 10:45:35

回答

0

已解決!

代碼是prett討厭,但我得到了我一直在尋找:

public function getMp3ListAsJSONArray() { 
     $songs = array(); 
     $mp3s = glob($this->files_path . '/*.mp3'); 

     foreach ($mp3s as $key => $mp3Source) { 
      $mp3Source = basename($mp3Source); 
      $mp3Title = substr($mp3Source, 4); 
      $mp3Title = substr($mp3Title, 0, -4); 
      $mp3Title = basename($mp3Source, ".mp3"); 
      $mp3Title = str_replace('_', ' ', $mp3Title); 
      $mp3Title = ucfirst($mp3Title); 

      $songs[$key]['title'] = $mp3Title; 
      $songs[$key]['mp3'] = urldecode($this->files_url . '/' . $mp3Source); 
     } 

     rsort($songs); 

     $pairCounter = 1; 
     $counter = 0; 
     foreach ($songs as $key => $value) { 
      $playlist[$pairCounter][] = $value; 
      $counter = $counter + 1; 

      if($counter == 2) { 
       $pairCounter = $pairCounter + 1; 
       $counter  = 0; 
      } 
     } 

     foreach ($playlist as $show) { 
      $finalList[] = $show[1]; 
      $finalList[] = $show[0]; 
     } 

     $finalList = json_encode($finalList); 

     return $finalList; 
    } 

輸出就像是我的主題中描述。

+0

這很大程度上依賴於每個文件的名稱相同。你將不得不保持這種格式,以保證每一個未來的文件。 – Rimble 2014-09-19 11:17:56

+0

是的,我明白了這一點,並將其放在腦海裏。我向客戶詢問有關情況,他們表示沒問題,他們可以考慮這一點。 – user2812532 2014-09-19 11:26:05

+1

你可以實現一個額外的功能來檢查正確的格式。例如。檢查字符長度等,以防止錯誤的數據被處理。 – Rimble 2014-09-19 11:37:58

0

你必須絕對編寫自己的字符串比較函數的例子。請記住,你有兩個不同的比較。第一部分將文件名的第一部分作爲字符串進行比較。第二部分比較數字,其中20來到2之後。這是第二部分的自然數字排序。第三部分是文件名中的最後一個點。這將被忽略。

<?php 

function value_compare($a, $b) { 
    $result = 0; 
    $descending = TRUE; 

    $positionA = strpos($a, 'part'); 
    $positionB = strpos($b, 'part'); 

    if ($positionA === $positionB) { 
     $compareFirstPart = substr_compare($a, $b, 0, $positionA + 1); 
     if ($compareFirstPart === 0) { 

      $length = 0; 
      $offset = $positionA + strlen('part'); 
      $positionDotA = strrpos($a, '.'); 
      $positionDotB = strrpos($b, '.'); 
      $part2A = ''; 
      $part2B = ''; 

      if ($positionDotA !== FALSE) { 
       $part2A = substr($a, $offset, $positionDotA); 
      } else { 
       $part2A = substr($a, $offset); 
      } 

      if ($positionDotB !== FALSE) { 
       $part2B = substr($b, $offset, $positionDotB); 
      } else { 
       $part2B = substr($b, $offset); 
      } 

      $result = strnatcmp($part2A, $part2B); 
     } else { 
      $result = $compareFirstPart; 
      if ($descending) { 
       $result = -$result; 
      } 
     } 
    } 

    return $result; 
} 

$shows = array('morning_show_15_02_2014_part2.mp3', 'morning_show_15_02_2014_part1.mp3', 'morning_show_14_02_2014_part2.mp3', 'morning_show_14_02_2014_part1.mp3', 'morning_show_13_02_2014_part2.mp3', 'morning_show_13_02_2014_part1.mp3'); 


usort($shows, 'value_compare'); 

var_dump($shows); 

?>