PHP按相同的值排序数组两次

时间:2014-09-19 10:37:48

标签: php arrays sorting

我有这样的节目名称数组:

$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部分。

如何才能将此列表按顺序排列?

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

解决!

代码很讨厌,但我得到了我想要的东西:

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;
    }

输出就像我在主题中描述的那样。

答案 1 :(得分:0)

尝试使用数组排序

以下是您的示例

http://techyline.com/php-sorting-array-with-unique-value/

答案 2 :(得分:0)

你一定要编写自己的字符串比较函数。请记住,您有2种不同的比较。第一部分将文件名的第一部分作为字符串进行比较。第二部分比较数字,其中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);

?>