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/AhX BvK0x9fg/d efault.jpg " id="AhXBvK0x9fg" part="17"/>
<video img="//i1.ytimg.com/vi/PzE dUMOBMRg/d efault.jpg " id="PzEdUMOBMRg" part="16"/>
<video img="//i2.ytimg.com/vi/Q4- j5zQLr2A/d efault.jpg " id="Q4-j5zQLr2A" part="15"/>
...
<video img="//i2.ytimg.com/vi/Q4- j5zQLr2A/d efault.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>" . " " .
"<a href='#' id='{$video['id']}' title='$title Ph¿n {$video['part']}'>".trim($ title)." Ph¿n {$video['part']}</a> "." < img src=\"{$CCT_site['img_path ']}videoic on.gif\" />" . "<br />";
}
}
echo "</div>";
}
It's still displaying part 17 down to 1.
Thanks in advance
<?xml version="1.0"?>
<YouTubeVideos>
<title>Video Title
<video img="//i2.ytimg.com/vi/AhX
<video img="//i1.ytimg.com/vi/PzE
<video img="//i2.ytimg.com/vi/Q4-
...
<video img="//i2.ytimg.com/vi/Q4-
</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>" . " " .
"<a href='#' id='{$video['id']}' title='$title Ph¿n {$video['part']}'>".trim($
}
}
echo "</div>";
}
It's still displaying part 17 down to 1.
Thanks in advance
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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);
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/d efault.jpg " id="Q4-j5zQLr2A" part="1"/>
<video img="//i2.ytimg.com/vi/Q4- j5zQLr2A/d efault.jpg " id="Q4-j5zQLr2A" part="15"/>
<video img="//i1.ytimg.com/vi/PzE dUMOBMRg/d efault.jpg " id="PzEdUMOBMRg" part="16"/>
<video img="//i2.ytimg.com/vi/AhX BvK0x9fg/d efault.jpg " id="AhXBvK0x9fg" part="17"/>
No usort() complexity anywhere in sight! HTH, ~Ray
http://www.laprbass.com/RAY_temp_aline0508.php
Outputs:
<video img="//i2.ytimg.com/vi/Q4-
<video img="//i2.ytimg.com/vi/Q4-
<video img="//i1.ytimg.com/vi/PzE
<video img="//i2.ytimg.com/vi/AhX
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);
}
https://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_3212-Using-PHP-classes-to-group-data-in-memory.html
Have a look and see if it helps.