繁体   English   中英

根据另一个数组的顺序对数组子键进行排序

[英]Sort Array Subkey Based on Another Array's Order

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

我在这里找到了一篇非常好的文章: 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 有大师的获胜解决方案:给他的道具! 1up他的回答! :)

但是,我稍微修改了 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;
      }
   }
}

假设您的播放列表在数组 $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

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

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

然后,您可以使用该顺序对曲目列表( 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数据,每个元素自然可以有任意数量的附加元素。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM