2012-06-01 2 views
2

Моя цель - встраивать сообщения Tumblr в веб-сайт, используя предоставленный XML. Проблема в том, что Tumblr сохраняет 6 разных размеров каждого изображения, которое вы публикуете. Мой код ниже получит первое изображение, но оно слишком велико. Как я могу выбрать одну из фотографий меньшего размера из XML, если все фотографии имеют один и тот же тег <photo-url>?Выберите конкретные значения XML Tumblr с PHP

→ Это XML из моего Tumblr, который я использую: Tumblr XML.

→ Это мой PHP код до сих пор:

<?php 
$request_url = "http://kthornbloom.tumblr.com/api/read?type=photo"; 
$xml = simplexml_load_file($request_url); 
$title = $xml->posts->post->{'photo-caption'}; 
$photo = $xml->posts->post->{'photo-url'}; 
echo '<h1>'.$title.'</h1>'; 
echo '<img src="'.$photo.'"/>"'; 
echo "…"; 
echo "</br><a target=frame2 href='".$link."'>Read More</a>"; 
?> 

ответ

1

Функция getPhoto принимает массив от $photos и $desiredWidth. Он возвращает фотографию, max-width является (1) ближе всего и (2) меньше или равно $desiredWidth. Вы можете адаптировать функцию в соответствии с вашими потребностями. Следует отметить следующие важные моменты:

  • $xml->posts->post->{'photo-url'} - это массив.
  • $photo['max-width'] обращается к атрибуту max-width на теге <photo>.

Я использовал echo '<pre>'; print_r($xml->posts->post); echo '</pre>';, чтобы узнать, что $xml->posts->post->{'photo-url'} был массив.

Я нашел синтаксис для доступа к атрибутам (например, $photo['max-width']) в документации для SimpleXMLElement.

function getPhoto($photos, $desiredWidth) { 
    $currentPhoto = NULL; 
    $currentDelta = PHP_INT_MAX; 
    foreach ($photos as $photo) { 
     $delta = abs($desiredWidth - $photo['max-width']); 
     if ($photo['max-width'] <= $desiredWidth && $delta < $currentDelta) { 
      $currentPhoto = $photo; 
      $currentDelta = $delta; 
     } 
    } 
    return $currentPhoto; 
} 

$request_url = "http://kthornbloom.tumblr.com/api/read?type=photo"; 
$xml = simplexml_load_file($request_url); 

foreach ($xml->posts->post as $post) { 
    echo '<h1>'.$post->{'photo-caption'}.'</h1>'; 
    echo '<img src="'.getPhoto($post->{'photo-url'}, 450).'"/>"'; 
    echo "..."; 
    echo "</br><a target=frame2 href='".$post['url']."'>Read More</a>"; 
} 
+0

PERFECT. Последний вопрос, если вы не возражаете - как бы я написал это, чтобы печатать каждый из моих сообщений, а не только самый последний? – kthornbloom

+0

Другой цикл foreach должен делать трюк. Я обновил свой ответ. – creemama

+0

Кроме того, я заменил '$ link' на' $ post ['url'] '. – creemama

0

Может быть, это:

$doc = simplexml_load_file(
    'http://kthornbloom.tumblr.com/api/read?type=photo' 
); 

foreach ($doc->posts->post as $post) { 
    foreach ($post->{'photo-url'} as $photo_url) { 
    echo $photo_url; 
    echo "\n"; 
    } 
} 
+0

Спасибо, что ответили, но это, кажется, распечатывает каждую фотографию. В XML я хотел бы выбрать из каждого сообщения. – kthornbloom

1

Чтобы получить фотографию с max-width="100":

$xml = simplexml_load_file('tumblr.xml'); 

echo '<h1>'.$xml->posts->post->{'photo-caption'}.'</h1>'; 

foreach($xml->posts->post->{'photo-url'} as $url) { 
    if ($url->attributes() == '100') 
     echo '<img src="'.$url.'" />'; 
} 
Смежные вопросы