簡體   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