Подраздел Sort Array на основе заказа другого массива - PullRequest
2 голосов
/ 15 июля 2011

Я знаю, что было много сообщений, касающихся сортировки массивов, но я выглядел высоко и низко и не могу найти решение своей проблемы.

Я нашел очень хорошую статью здесь: 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, чтобы соответствовать тому же порядку массива списка воспроизведения?

Буду признателен за любую помощь или руководство!

Спасибо.

[РЕШЕНИЕ] У Эдди было главное решение для победы! Реквизит для него! 1up его ответ! :)

Однако я немного изменил решение Эдди. Я только что добавил проверку на сходство в 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 ]

4 голосов
/ 15 июля 2011

Предполагается, что ваш список воспроизведения находится в массиве $ 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
2 голосов
/ 15 июля 2011

Вес вы сортируете по положению каждой дорожки в списке воспроизведения.

Таким образом, вам нужно найти каждую дорожку внутри списка воспроизведения (положение), чтобы получить вес дорожки в списке дорожек..

Затем вы можете использовать этот порядок для сортировки списка треков ( 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, каждый элемент может иметь любое количество дополнительных элементов, естественно.

1 голос
/ 15 июля 2011

неэффективно, но должно работать:

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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...