【问题标题】:usort array of arrays - list songs alphabeticallyusort array of arrays - 按字母顺序列出歌曲
【发布时间】:2013-01-02 18:52:26
【问题描述】:

因此,我编写了一组函数,它们将采用下面的数组并按字母顺序对所有歌曲进行排序。问题是它所做的只是按照艺术家在数组中的排列顺序吐出歌曲。

函数

function arraySort($a, $b){
    return $a['title'] > $b['title'];
}


function sortSongs($artist){
    $count = count($artist);
    if($count == 2){
        foreach($artist as $album=>$trackListing){
            sortSongs($artist[$album]);
        }
    }else{
       foreach($artist as $key=>&$value){
           usort($artist[$key], 'arraySort');
           print_r($artist);
       }
    }

}

sortSongs($music['Creed']);

数组

$music = array(
    'Creed' => array(
        'Human Clay' => array(
            array(
                'title' => 'Are You Ready'
            ),
            array(
                'title' => 'What If'
            ),
            array(
                'title' => 'Beautiful'
            ),
            array(
                'title' => 'Say I'
            ),
        ),
        'Full Circle' => array(
            array(
                'title' => 'Overcome'
            ),
            array(
                'title' => 'Bread of Shame'
            ),
            array(
                'title' => 'A Thousand Faces'
            ),
            array(
                'title' => 'Suddenly'
            ),
            array(
                'title' => 'Rain'
            ),
            array(
                'title' => 'Away in Silence'
            ),
        ),
    ), 
);

注意:我缩短了数组以供阅读。

所以我所做的只是说,如果我传入的艺术家有 2 张专辑,那么我们传入专辑名称,然后在该专辑的歌曲上使用 usort ......我得到的只是确切的我向您展示的相同数组,未排序。

【问题讨论】:

  • 感谢您提供格式正确的代码。
  • @phpisuber01 你的评论对我没有帮助

标签: php sorting usort


【解决方案1】:

你在那里是正确的,只是不需要 foreach 那里的专辑。

function sortSongs($artist){
$count = count($artist);
if($count == 2){
    foreach($artist as $album=>$trackListing){
        sortSongs($artist[$album]);
    }
}else{
       usort($artist, 'arraySort');
       print_r($artist);
}

}

【讨论】:

  • 有没有办法反过来呢?喜欢而不是按字母顺序我怎么能反转z-a?
  • 是的,只需在arraySort() 的返回/比较行中交换$a$b
【解决方案2】:

看起来您正在向 usort 传递一个包含 1 个项目的数组,即 usort(array('title' => 'Rain'), arraySort);

所以你得到了相同的数组,因为你实际上是在告诉它什么都不排序。

要纠正这个问题,您应该尝试将整个专辑数组发送给它,所以不要传递艺术家[$key],而是只传递$artist。

作为一个警告,您的递归基本案例似乎非常挑剔,这不是测试是否递归的好方法。测试计数 2 基本上只适用于您的数组与您提供的数组相同的情况,这不是一般的基本情况。

【讨论】:

  • 我也会接受你的答案....但我只能接受一个 D:我希望我们可以接受主要答案,然后将次要答案作为“信息”,因为他的代码是有道理的,你的解释更有意义。
【解决方案3】:

这是非常疯狂的代码。但由于你有这么多嵌套数组,我真的没有看到更好的方法,而不是循环遍历所有内容。一探究竟。理想情况下,你可以从中得到你想要的。如果你花更多的时间在这个概念上,你可以制作一些非常好的 array_walk 函数或类似的函数来更整洁地完成工作。

主要功能:

natsort

ksort

PHP

arraySort('Creed', $music);
echo '<pre>';
print_r($music);
echo '</pre>';

function arraySort($artist, &$music) {
    // Validate we have an array
    if(is_array($music[$artist])) {
        // Sort the albums the best we can (natsort not natually available for keys)
        ksort($music[$artist]);
        // Loop through the artists albums
        foreach($music[$artist] as $album_name => $album) {
            // Loop through the songs
            foreach($album as $songs)
            {
                // Let's build a new helper array of songs
                $new_array = array();
                foreach($music[$artist][$album_name] as $title)
                {
                    $new_array[] = $title['title'];
                }
                // Natural sort the songs
                natsort($new_array);

                // Reset the Songs array
                $music[$artist][$album_name] = array();

                // Replace the songs as they're sorted back into the music array
                foreach($new_array as $stitle)
                {
                    $music[$artist][$album_name][] = array('title' => $stitle);
                }
            }
        }
    }
}

输出

Array
(
    [Creed] => Array
        (
            [Full Circle] => Array
                (
                    [0] => Array
                        (
                            [title] => A Thousand Faces
                        )

                    [1] => Array
                        (
                            [title] => Away in Silence
                        )

                    [2] => Array
                        (
                            [title] => Bread of Shame
                        )

                    [3] => Array
                        (
                            [title] => Overcome
                        )

                    [4] => Array
                        (
                            [title] => Rain
                        )

                    [5] => Array
                        (
                            [title] => Suddenly
                        )

                )

            [Human Clay] => Array
                (
                    [0] => Array
                        (
                            [title] => Are You Ready
                        )

                    [1] => Array
                        (
                            [title] => Beautiful
                        )

                    [2] => Array
                        (
                            [title] => Say I
                        )

                    [3] => Array
                        (
                            [title] => What If
                        )

                )

        )

)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多