我知道有很多关于数组排序的帖子,但我已经看了高低,找不到解决我问题的方法。
我在这里找到了一篇非常好的文章:http://firsttube.com/read/sorting-a-multi-dimensional-array-with-php/
上面的链接很好,但是,我希望更进一步,根据另一个数组的顺序对数组子键进行排序。
那么,假设我们在Playlist Array中有五首歌:
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
)
假设我们希望对以下信息进行排序以匹配Playlist Array的顺序:
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的解决方案。我只是在用户输入的歌曲标题和从外部来源查找的歌曲标题之间添加了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
从每个trackname在播放列表中的位置获得排序权重。
所以你需要在播放列表(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);
注意:这只在播放列表中的trackname与track-list中的trackname相同时才有效。根据你在问题中给出的示例数据,情况并非如此。
另外,我简化了您的$tracks
数据,每个元素可以有任意数量的附加元素。
这不是有效的,但应该工作:
usort($songsArray,function($a,$b){
return array_search($a['trackName'],$GLOBALS['playlistarray'])-array_search($b['trackName'],$GLOBALS['playlistarray']);
});
Hakre的想法:
usort($songsArray,function($a,$b) use($playlistarray){
return array_search($a['trackName'],$playlistarray)-array_search($b['trackName'],$playlistarray);
});