0

だから私は私が書いたこの一連の関数を持っています。それは以下の配列を取り、すべての曲をアルファベット順にソートします。問題は、アーティストの曲を配列に配置されたのと同じ順序で吐き出すことだけです。

機能

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を使用するということです。未分類でお見せしました。

4

3 に答える 3

0

これはかなりクレイジーなコードです。しかし、ネストされた配列が非常に多いため、すべてをループしないと、これ以上の方法はわかりません。見てみな。理想的には、これからあなたが望むものをとることができます。コンセプトにもっと時間を費やすと、非常に優れた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
                        )

                )

        )

)
于 2013-01-02T19:12:34.153 に答える
0

usortに1つのアイテムの配列を渡しているようです。つまり、usort(array('title' =>'Rain')、arraySort);

つまり、基本的に何もソートしないように指示しているため、同じ配列が返されます。

この問題を修正するには、アルバム配列全体を送信してみてください。したがって、artist [$ key]の代わりに、$artistだけを渡してください。

また、警告として、再帰の基本ケースは非常に扱いにくいように思われるため、再帰するかどうかをテストするための優れた方法ではありません。カウント2のテストは、基本的に、提示したものと同じ配列がある場合にのみ機能します。これは一般的な基本ケースではありません。

于 2013-01-02T19:13:27.053 に答える
0

あなたはそこに順調に進んでいます、ただそこのアルバムのために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);
}

}

于 2013-01-02T19:15:16.800 に答える