2013-04-18 2 views
0

У меня есть следующий код:Получить Youtube API данных для миниатюр с SimpleXML

$rss = simplexml_load_file('http://gdata.youtube.com/feeds/api/playlists/PLEA1736AA2720470C?v=2&prettyprint=true'); 

foreach ($rss->entry as $entry) { 
    // get nodes in media: namespace for media information 
    $media = $entry->children('http://search.yahoo.com/mrss/'); 
    $thumbs = $media->group->thumbnail; 
    $thumb_attrs = array(); 
    $index = 0; 
    // get thumbnails attributes: url | height | width 
    foreach ($thumbs as $thumb) { 
     foreach ($thumb->attributes() as $attr => $value) { 
      $thumb_attrs[$index][$attr] = $value; 
      print $attr . ': ' . $thumb_attrs[$index][$attr] . "| "; 
     } 
     $index++; 
     print "<br>"; 
    } 
} 

Выход печати будет:

url: http://i.ytimg.com/vi/te28_L-dO88/default.jpg| height: 90| width: 120| time: 00:00:49| 
... 

из XML-тегов в следующем формате:

<media:thumbnail url='http://i.ytimg.com/vi/4l4rwvAPhfA/default.jpg' height='90' width='120' time='00:02:23.500' yt:name='default'/> 
... 

Как добавить атрибут с пространством имен yt name = 'default', который я не получаю в массиве?

Как я могу получить самое близкое значение всей ширины к другому значению из массива? Что-то похожее на PHP - Nearest value from an array, но с учетом того, что мой массив многомерен.

ответ

0

Проблема с simplexml и пространствами имен заключается в том, что вам нужно получить доступ к любым элементам или атрибутам, расположенным по имени, по имени, то есть вы не можете сказать: «Дайте мне все атрибуты, независимо от пространства имен». Таким образом, вы должны сделать некоторые зацикливание, опираясь на инструменты Пространства имен SimpleXml в:

$rss = simplexml_load_file('http://gdata.youtube.com/feeds/api/playlists/PLEA1736AA2720470C?v=2&prettyprint=true'); 
$namespaces=$rss->getNameSpaces(true); // access all the namespaces used in the tree 
array_unshift($namespaces,""); // add a blank at the beginning of the array to deal with the unprefixed default 
foreach ($rss->entry as $entry) { 
    // get nodes in media: namespace for media information 
    $media = $entry->children('http://search.yahoo.com/mrss/'); 
    $thumbs = $media->group->thumbnail; 
    $thumb_attrs = array(); 
    $index = 0; 
    // get thumbnails attributes: url | height | width 
    foreach ($thumbs as $thumb) { 
     $attrstring=""; 
     foreach ($namespaces as $ns) { 
       foreach ($thumb->attributes($ns) as $attr => $value) { // get all attributes, whatever namespace they might be in 
         $thumb_attrs[$index][$attr] = $value; 
         $attrstring.=$attr . ': ' . $thumb_attrs[$index][$attr] . "| "; 
       } 
     } 
     print $attrstring; 
     $index++; 
     print "<br>"; 
    } 
} 

Что касается второй части вашего вопроса, я не 100% уверен, что вы просите. Если это действительно похоже на вопрос, на который вы ссылаетесь, не могли бы вы просто создать пустой массив перед вашим циклом и добавить ширину каждой записи в этот массив? Когда ваш цикл будет выполнен, у вас будет сплющенный массив только ширины.

Но если вы спрашиваете что-то еще, возможно, вы можете уточнить?

Смежные вопросы