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
aline0508Asked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
babuno5Connect With a Mentor Commented:
try this

if (!empty($xml->title)) {
   echo "<div id=\"div-wrap-around-a\">";
   foreach ($xml->title as $title) {
       $count = count($title);
         $newvideo = array();
         foreach($title->video as $tmp_new)
         {
                  $newvideo[] =array('id'=>(string)$tmp_new['id'],'part'=>(int)$tmp_new['part'],'img'=>(string)$tmp_new['img']);
         }
       usort($newvideo, 'sortByPart');
       foreach ( $newvideo 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>";
}
0
 
Beverley PortlockCommented:
1
 
Ray PaseurCommented:
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

0
 
aline0508Author Commented:
Thanks.
0
 
Ray PaseurCommented:
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

0
All Courses

From novice to tech pro — start learning today.