Skip to content

Instantly share code, notes, and snippets.

@kmgdevelopment
Created August 22, 2012 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kmgdevelopment/3427969 to your computer and use it in GitHub Desktop.
Save kmgdevelopment/3427969 to your computer and use it in GitHub Desktop.
Parse XML by Category
<?php
$jobs = simplexml_load_file('jobfeed.xml');
function output_list($jobs = array())
{
$data = array();
foreach($jobs->xpath('/jobs/job') as $job_details)
{
$category = $job_details->department;
$title = $job_details->title;
$url = $job_details->url;
if(!isset($data[$category]))
{
$data[$category] = array();
}
$data[$category][] = '<li>Category: '.$category.'<br>Title: '.$title.'<br>URL: '.$url.'</li>';
}
foreach($data as $category => $items)
{
$data[$category] = '<li><ul>'.implode('', $items).'</ul></li>';
}
return '<ul>'.implode('', $data).'</ul>';
}
echo output_list($jobs);
?>
@kmgdevelopment
Copy link
Author

I only made 2 modifications to the code you wrote:

  • First, the actual XML tag for "category" isn't labeled <category> but <department>, so I changed that on line 10.
  • Second, I added anxpath to the foreach parameters on line 8 to account for extra data inside the real <jobs> tag.

But I don't see how either of those changes would cause errors.

I actually get several EE PHP errors:

line 14:

Illegal offset type in isset or empty

lines 16 & 19:

Illegal offset type

@objectivehtml
Copy link

Add right above line 14, var_dump($data);exit();

That will output the $data array and see why there is an error. My guess is the $category variable is NULL or not set correctly and is possible a bad index. You could also do a var_dump($category);exit(); above live 14 to see what the category value is. Ensure that it actually has some value and those errors should do away. You are really close. My logis is 100% correct, it's just conflicts with your data and my code.

@kmgdevelopment
Copy link
Author

var_dump($data); gives me this: array(0) { }

var_dump($category); gives me this: object(SimpleXMLElement)#47 (0) { }

Both would imply that there is no data being returned for the $category variable, which confuses the hell out of me because if I do this:

<ul>
<?php
    $jobs = simplexml_load_file('jobfeed.xml');

    foreach ($jobs->xpath('/jobs/job') as $jobDetails) {
        $category = $jobDetails->department;
        $title = $jobDetails->title;
        $url = $jobDetails->url;

        echo '<li>Category: ',$category,'<br>Title: ',$title,'<br>URL: ',$url,'</li>';
    }
?>
</ul>

The categories are output perfectly fine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment