排序的JSON仍然部分失序

时间:2018-12-01 23:30:58

标签: php json sorting

我正在尝试解析iTunes搜索专辑/曲目信息。曲目列表乱序,当我尝试按曲目号排序时,它仍然略有乱序。

例如,我正在解析:

$url = 'https://itunes.apple.com/search?term=band+name&entity=song';
$json = file_get_contents($url);
$data = json_decode($json, true);

asort($data['results']);

if(!empty($data['results'])) {
  foreach($data['results'] as $album) {
    echo '<p>'.$album['trackNumber'].'. '.$album['trackName'].'</p>';
  }
}

轨道号结果为:1、2、3、4、5、6、7、8、9、10、12、11。由于某种原因,在11之前显示12。这是什么原因? / p>

任何建议将不胜感激。预先感谢。

1 个答案:

答案 0 :(得分:2)

要按特定键(在您的情况下为trackNumber)的值对数组进行排序,您需要使用usort和比较函数(在下面的示例中为cmp) )

$url = 'https://itunes.apple.com/search?term=band+name&entity=song';
$json = file_get_contents($url);
$data = json_decode($json, true);

usort( $data['results'], 'cmp' );

if(!empty($data['results'])) {
  foreach($data['results'] as $album) {
    echo '<p>'.$album['trackNumber'].'. '.$album['trackName'].'</p>';
  }
}


// comparison function

function cmp( $a, $b )
{
    if ($a['trackNumber'] == $b['trackNumber']) {
        return 0;
    }
    return ($a['trackNumber'] < $b['trackNumber']) ? -1 : 1;
}  

这就是你得到的

1. Glorious Day (feat. Kristian Stanfill)
1. New Feeling
1. Rocket Science (feat. Tyler Eads)
1. What Yo Name Iz? (Remix) [feat. Wale, Big Sean and Bun B]
2. A Clean Break (Let's Work) [Live]
2. Worthy of Your Name (feat. Sean Curran)
3. Don't Worry About the Government
3. How Great Is Your Love (feat. Kristian Stanfill)
4. Pulled Up
4. Build My Life (feat. Brett Younker)
[...]

请注意,您有更多的曲目具有相同的曲目编号。

那是因为您获得的结果是来自不同专辑的曲目。

在排序或改进比较功能之前,您可能需要过滤结果。