基于另一个数组的顺序对数组子键进行排序

时间:2011-07-15 18:23:51

标签: php arrays sorting multidimensional-array

我知道有很多关于数组排序的帖子,但我看起来很高,也找不到我的问题的解决方案。

我在这里找到了一篇非常好的文章: http://firsttube.com/read/sorting-a-multi-dimensional-array-with-php/

上面的链接很棒,但是,我希望进一步根据另一个数组的顺序对数组子键进行排序。

所以,假设我们在播放列表数组中有五首歌曲

Array
(
    [0] => 3oh!3 - Don't Trust me
    [1] => Taylor Swift - You Belong with me
    [2] => Sean Kingston - Fire Burning
    [3] => Green Day - Know Your Enemy
    [4] => Kelly Clarkson - Gone
)

我们假设我们要根据播放列表数组的顺序排序以下信息:

Array
(
    [0] => Array
        (
            [trackName] => Taylor Swift - You Belong With Me
            [trackLength] => 0
            [trackViews] => 0
            [trackRating] => 0
        )

    [1] => Array
        (
            [trackName] => Sean Kingston - Fire Burning
            [trackLength] => 0
            [trackViews] => 0
            [trackRating] => 0
        )

    [2] => Array
        (
            [trackName] => 3OH!3- Dont Trust Me 
            [trackLength] => 205
            [trackViews] => 4570399
            [trackRating] => 4.866372
        )

    [3] => Array
        (
            [trackName] => Green Day Know Your Enemy 
            [trackLength] => 191
            [trackViews] => 4715494
            [trackRating] => 4.9103785
        )

    [4] => Array
        (
            [trackName] => Kelly Clarkson: Gone 
            [trackLength] => 225
            [trackViews] => 679019
            [trackRating] => 4.8995433
        )

)

所以,再次......我的问题是:如何通过trackName对歌曲数组进行排序以匹配播放列表数组的相同顺序?

任何帮助或指导都将不胜感激!

感谢。

[溶液] EDDIE拥有大师级的解决方案!道具给他! 1他的回答! :)

然而,我略微修改了eddie的解决方案。我刚刚在用户输入的歌曲标题和在外部来源上查找的歌曲标题之间添加了75%的相似性检查,因为我无法控制每个标题的细微变化。

$sorted_list = array();

foreach($songs as $song_key=>$song){
   foreach($song_info as $info){
      similar_text($info['trackName'], $song, $p);
      if($p > 75){ 
        $sorted_list[$song_key] = $info;
      }
   }
}

3 个答案:

答案 0 :(得分:4)

假设您的播放列表位于数组$ songs中,而另一个数组位于$ songs_info中。

$sorted_list = array();

foreach($songs as $song_key=>$song){
   foreach($song_info as $info){
      if($info['trackName'] == $song){
          $sorted_list[$song_key] = $info;
      }
   }
}

// $sorted_list contains sorted list

答案 1 :(得分:2)

您可以从播放列表中每个曲目名称的位置获得排序权重。

因此,您需要找到播放列表(位置)内的每个曲目,以获得曲目列表中曲目的权重。

然后,您可以使用该顺序对跟踪列表(Demo)进行排序:

$playlist = array
(
    '3OH!3- Don\'t Trust Me',
    'Taylor Swift - You Belong With Me',
    'Sean Kingston - Fire Burning',
    'Green Day - Know Your Enemy',
    'Kelly Clarkson - Gone',
);

$tracks = array
(
    array('trackName' => 'Taylor Swift - You Belong With Me'),
    array('trackName' => 'Sean Kingston - Fire Burning'),
    array('trackName' => '3OH!3- Don\'t Trust Me'),
    array('trackName' => 'Green Day - Know Your Enemy'),
    array('trackName' => 'Kelly Clarkson - Gone'),
);

$order = array_map(function($track) use ($playlist) {
    return array_search($track['trackName'], $playlist);
;}, $tracks);

array_multisort($order, $tracks);

var_dump($tracks);

注意:仅当播放列表中的曲目名与曲目列表中的曲目名相同时,此功能才有效。使用您在问题中提供的示例数据,情况并非如此。

此外,我简化了您的$tracks数据,每个元素都可以自然地拥有任意数量的其他元素。

答案 2 :(得分:1)

它不是有效的,但应该有效:

usort($songsArray,function($a,$b){
    return array_search($a['trackName'],$GLOBALS['playlistarray'])-array_search($b['trackName'],$GLOBALS['playlistarray']);
});

哈克的想法:

usort($songsArray,function($a,$b) use($playlistarray){
    return array_search($a['trackName'],$playlistarray)-array_search($b['trackName'],$playlistarray);
});