2014-09-19 66 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); 

?>