json_decode: array_reduce перестал работать

<?php
$json = "http://pastebin.com/raw.php?i=e1Sw66C3";
$data = json_decode(file_get_contents($json), true);

$data = $data['recenttracks'];
$tracks=$data['track'];

foreach ($tracks as $track) {
$artist = $track['artist']['#text'];
$title = $track['name'];
$url = $track['url'];
$image = array_reduce($track['image'], function ($image, array $i) { return $image ?: ($i['size'] == 'large' ? $i['#text'] : null); });
echo '<li><a rel="external nofollow" href="'.htmlentities($url, ENT_QUOTES, "UTF-8").'" title="', $title, '">', $artist, ' - ', $title, '</a></li>'; }
echo ($image);
?>

Этот фрагмент всегда работал. Теперь я не знаю, почему БУМ echo ($image); ничего не выводит.
Я не могу понять, что не так с этой функцией. Остальная часть кода работает нормально (другая информация взята из ввода). Вы можете проверить вход, перейдя по ссылке в file_get_contents,

1

Решение

Как я уже писал в комментариях, ранее ваш код работал только потому, что элемент с size = 'large' был последним, в противном случае переменная $image перезаписывается при каждом цикле. Что вам нужно, это что-то вроде этого

$json = "http://pastebin.com/raw.php?i=e1Sw66C3";
$data = json_decode(file_get_contents($json), true);

$data = $data['recenttracks'];
$tracks=$data['track'];
$images = array();

foreach ($tracks as $track) {
$artist = $track['artist']['#text'];
$title = $track['name'];
$url = $track['url'];
if (isset($track['image']) && is_array($track['image']))
foreach($track['image'] as $image)
if (isset($image['size']) && $image['size'] == 'large' &&
isset($image['#text']) && !empty($image['#text']))
$images[] = $image['#text'];

echo '<li><a rel="external nofollow" href="' .
htmlentities($url, ENT_QUOTES, "UTF-8") . '" title="', $title, '">',
$artist, ' - ', $title, '</a></li>';
}
echo join("\n", $images);
0

Другие решения

Других решений пока нет …