tags:

views:

18

answers:

2

I am using PHP to iterate over the following result set, the aim is to build a hyperlink for each result using a foreach loop. I have stored the XML result in $images, and have constructed this loop:

  foreach ($images as $image) {
  //Build link to each photo returned

  //base URL
  $flickrPhotoUrl = 'http://www.flickr.com/photos/';
  //Append user ID
  $flickrPhotoUrl .= "";
  echo $flickrPhotoUrl;       }

Here is a sample result from Flickr:

  <photos page="1" pages="10982" perpage="10" total="109813">
  <photo id="4616840471" owner="47823583@N03" secret="1b83173bc0" server="4013" farm="5" title="Strawberry Bears" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4616612597" owner="12658756@N08" secret="f626214382" server="4059" farm="5" title="Yarn Chef Minestrone - Grickle Grass" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4616469567" owner="26284268@N00" secret="6911a66838" server="4022" farm="5" title="P5130121.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4617076736" owner="26284268@N00" secret="8b990acba4" server="4047" farm="5" title="P5130106.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4616470013" owner="26284268@N00" secret="44600b3836" server="4036" farm="5" title="P5130125.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4616466147" owner="26284268@N00" secret="554eab8667" server="4052" farm="5" title="P5130116.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4617082398" owner="26284268@N00" secret="4a2b663442" server="3350" farm="4" title="P5130118.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4617078272" owner="26284268@N00" secret="357737017b" server="4013" farm="5" title="P5130109.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4617081446" owner="26284268@N00" secret="1f87726497" server="4048" farm="5" title="P5130117.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>
<photo id="4617077676" owner="26284268@N00" secret="77ca9f754a" server="3330" farm="4" title="P5130108.JPG" ispublic="1" isfriend="0" isfamily="0"></photo>

A: 

I use XML_Unserializer from PEAR


$options = array(
    'complexType' => 'object',
    'encoding' => 'utf-8',
    'parseAttributes' => TRUE,
    'returnResult' => TRUE
);
$xr = new XML_Unserializer($options);
$images = $xr->unserialize($images);

$flickrPhotoUrl = 'http://www.flickr.com/photos/';

foreach($images->photos as $photo)
{
$flickrPhotoUrl .= $photo->owner;
}
Geek Num 88
I tried this a few different ways myself, and failed every time (getting a "Invalid document end at XML input line 1:1" error, even with validated XML/RSS contents). Also, I found that I needed to add "require_once 'XML/Unserializer.php';" before calling the XML_Unserializer object.
Lucanos
Yes the require is how to include the PEAR library. If we are looking at the sample data above - there is no finishing </photos> - I use this PEAR object on a production site that runs unserializations all day long with no problems - it might be the version you have installed
Geek Num 88
+1  A: 

You can use PHP's SimpleXML to manipulate/traverse to your XML easily. Assuming you have your resulting your resulting xml string stored in $images,

$images_xml = simplexml_load_string($images);
$flickr_url = "http://flickr.com/photos/";

foreach($images_xml->children() as $image)
{
     $attributes = $image->attributes();
     $image_url = $flickr_url . $attributes->id;
     //Do whatever you want to do with the link
     //for example, echo it
     echo "<br /><a href=\"". $image_url ."\">" . $attributes->title . "</a>";

     //Not sure if the link points to an actual image, but is the idea :)
}

Just for reference purposes http://www.php.net/manual/en/book.simplexml.php

Hope that helps.

falomir