Link to home
Start Free TrialLog in
Avatar of aline0508
aline0508

asked on

php usort

I have this xml file from my YouTube account:
<?xml version="1.0"?>
<YouTubeVideos>
      <title>Video Title
            <video img="//i2.ytimg.com/vi/AhXBvK0x9fg/default.jpg" id="AhXBvK0x9fg" part="17"/>
            <video img="//i1.ytimg.com/vi/PzEdUMOBMRg/default.jpg" id="PzEdUMOBMRg" part="16"/>
            <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="15"/>
                 ...
                 <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="1"/>
       </title>
</YouTubeVideos>

Now I want to use usort() function to sort by part:

function sortByPart( $a, $b ){
    if ( $a[part] == $b[part] )
        return 0;
    if ( $a[part] < $b[part] )
         return -1;
    return 1;
}
            
$file = '../YouTubeVideos.xml';
$xml = simplexml_load_file($file);
if (!empty($xml->title)) {
   echo "<div id=\"div-wrap-around-a\">";
   foreach ($xml->title as $title) {
       $count = count($title);
       usort($title->video, 'sortByPart');
       foreach ( $title->video as $video ) {
             echo "<a href='#' id='{$video['id']}' title='$title Ph¿n {$video['part']}'><img src={$video['img']} width=50 align=\"absmiddle\" style=\"padding:5px\" /></a>" . " &nbsp; " .
                      "<a href='#' id='{$video['id']}' title='$title Ph¿n {$video['part']}'>".trim($title)." Ph¿n {$video['part']}</a>&nbsp;"."&nbsp;<img src=\"{$CCT_site['img_path']}videoicon.gif\" />" . "<br />";
          }
    }
    echo "</div>";
}

It's still displaying part 17 down to 1.

Thanks in advance
Avatar of Beverley Portlock
Beverley Portlock
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER CERTIFIED SOLUTION
Avatar of babuno5
babuno5
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
I am having trouble making sense of the XML string.  Install this and run it to see why.
<?php // RAY_temp_aline0508.php
error_reporting(E_ALL);
echo "<pre>";


// TEST DATA FROM THE POST AT EE
$xml = <<<XML
<?xml version="1.0"?>
<YouTubeVideos>
      <title>Video Title
            <video img="//i2.ytimg.com/vi/AhXBvK0x9fg/default.jpg" id="AhXBvK0x9fg" part="17"/>
            <video img="//i1.ytimg.com/vi/PzEdUMOBMRg/default.jpg" id="PzEdUMOBMRg" part="16"/>
            <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="15"/>
            <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="1"/>
       </title>
</YouTubeVideos>
XML;


// MAKE AN OBJECT
$obj = SimpleXML_Load_String($xml);

// VISUALIZE THE OBJECT
var_dump($obj);

Open in new window

Avatar of aline0508
aline0508

ASKER

Thanks.
If you make a small modification to the XML string, you can use something like this.
http://www.laprbass.com/RAY_temp_aline0508.php
Outputs:
<video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="1"/>
<video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="15"/>
<video img="//i1.ytimg.com/vi/PzEdUMOBMRg/default.jpg" id="PzEdUMOBMRg" part="16"/>
<video img="//i2.ytimg.com/vi/AhXBvK0x9fg/default.jpg" id="AhXBvK0x9fg" part="17"/>

No usort() complexity anywhere in sight!  HTH, ~Ray
<?php // RAY_temp_aline0508.php
error_reporting(E_ALL);
echo "<pre>";


// A DERIVATIVE OF THE TEST DATA FROM THE POST AT EE
$xml = <<<XML
<?xml version="1.0"?>
<YouTubeVideos>
   <YouTubeVideo>
      <title>Video Title</title>
      <video img="//i2.ytimg.com/vi/AhXBvK0x9fg/default.jpg" id="AhXBvK0x9fg" part="17"/>
      <video img="//i1.ytimg.com/vi/PzEdUMOBMRg/default.jpg" id="PzEdUMOBMRg" part="16"/>
      <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="15"/>
      <video img="//i2.ytimg.com/vi/Q4-j5zQLr2A/default.jpg" id="Q4-j5zQLr2A" part="1"/>
   </YouTubeVideo>
</YouTubeVideos>
XML;


// MAKE AN OBJECT
$obj = SimpleXML_Load_String($xml);

// ACTIVATE THIS TO VISUALIZE THE OBJECT
// var_dump($obj);

// COPY THE VIDEO IMG TAGS INTO A KEYED ARRAY
foreach ($obj->YouTubeVideo->video as $v)
{
    // CREATE A TAG AND AN ARRAY INDEX FROM THE OBJECT
    $tag = $v->AsXML();
    $ndx = (string)$v["part"];

    // USE THE PART NUMBER AS THE ARRAY INDEX KEY
    $arr[$ndx] = $tag;
}

// SORT BY THE KEYS
ksort($arr);

// SHOW THE WORK PRODUCT
foreach ($arr as $video_tag)
{
    echo PHP_EOL . htmlentities($video_tag);
}

Open in new window