Help With Sorting a Foreach loop into Outputting in a Particular Order

I have a file uploader in my forum, for people to upload albums they have written. I have modified Uber Uploader (a progress bar script) to my needs for this usage. After upload is complete i have it writing an xspf playlist file for an audio player from the mp3 files it finds. My problem is uber uploader has a random (well, i cant find how it does it) way of cycling through its uploaded filelist and does not follow the upload order in its output end. This means my xspf playlist file is not created with the correct track order for the album.

I have now included getid3 so that I can grab id3 data from the mp3. How can I make the foreach loop output the stringdata for the xspf in order of the track field getid3 finds? 1,2,3,4,5 sequentially.

Code below shows what I have working:
function createxspfplayer($_FILE_DATA, $_CONFIG_DATA, $_POST_DATA)
 
{
  
include('../../getid3/getid3.php');
 
$mp3pattern = '/.mp3/i';
$xspffile = $_CONFIG_DATA['absolute_path'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$xspfurl = $_CONFIG_DATA['path_to_upload'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$fh = fopen($xspffile, 'w') or die("can't open file");
 
$stringData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<playlist version=\"0\" xmlns=\"http://xspf.org/ns/0/\">
   <trackList>";
 
fwrite($fh, $stringData);
 
 
 
foreach($_FILE_DATA as $slot => $value){
		$file_slot = $_FILE_DATA[$slot]->getFileInfo('slot');
		$file_name = $_FILE_DATA[$slot]->getFileInfo('name');
                    if($file_size > 0){
 
                            $file_path = $_CONFIG_DATA['path_to_upload'] . $file_name;
 
                          if (preg_match($mp3pattern, $file_name))
                           {
 
                           $getID3 = new getID3;
                           $mp3path = $_CONFIG_DATA['absolute_path'] . $file_name;
                           $mp3info = $getID3->analyze($mp3path);
                           getid3_lib::CopyTagsToComments($mp3info);
 
// @$mp3Info['comments_html']['track'][0] would give me the track number from the mp3, obviously a new/different type of loop must be created to sort, this is what i am asking for help with
 
                           $stringData = "<track>
                           <location>" . $file_path . "</location>
                           <info>" . $file_path . "</info>
                           <title>" . @$mp3info['comments_html']['track'][0] . " " . @$mp3info['tags']['id3v2']['title'][0] . " " . @$mp3info['playtime_string'] . "</title>
                           <link>http://www.aiwazz.com/mdp/</link>
                           </track>";
 
                           fwrite($fh, $stringData);
                           }
 
		}
		else{ echo '' . $file_name . ' <span class="ubrError">Failed To Upload</span>'; }
 
  }
$stringData = "</trackList>
</playlist>";
 
fwrite($fh, $stringData);
 
fclose($fh);

Open in new window

aiwazzAsked:
Who is Participating?
 
Michael701Connect With a Mentor Commented:
untested code, but try this.
<?php
function createxspfplayer($_FILE_DATA, $_CONFIG_DATA, $_POST_DATA)
 
{
  
include('../../getid3/getid3.php');
 
$mp3pattern = '/.mp3/i';
$xspffile = $_CONFIG_DATA['absolute_path'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$xspfurl = $_CONFIG_DATA['path_to_upload'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$fh = fopen($xspffile, 'w') or die("can't open file");
 
$stringData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<playlist version=\"0\" xmlns=\"http://xspf.org/ns/0/\">
   <trackList>";
 
fwrite($fh, $stringData);
 
foreach($_FILE_DATA as $slot => $value)
{
  $file_slot = $_FILE_DATA[$slot]->getFileInfo('slot');
  $file_name = $_FILE_DATA[$slot]->getFileInfo('name');
  if(filesize($_CONFIG_DATA['absolute_path'] . $file_name) > 0) // $file_size was not set
  {
    $file_path = $_CONFIG_DATA['path_to_upload'] . $file_name;
 
    if (preg_match($mp3pattern, $file_name))
    {
      $getID3 = new getID3;
      $mp3path = $_CONFIG_DATA['absolute_path'] . $file_name;
      $mp3info = $getID3->analyze($mp3path);
      getid3_lib::CopyTagsToComments($mp3info);
       
      $by_track[ mp3Info['comments_html']['track'][0] ] = $slot;
    }
  }
}
 
ksort($by_track);
reset($by_track); // resets foreach pointer to the begining of the array
 
foreach($by_track as $track => $slot){
                $file_slot = $_FILE_DATA[$slot]->getFileInfo('slot');
                $file_name = $_FILE_DATA[$slot]->getFileInfo('name');
                    if($file_size > 0){
 
                            $file_path = $_CONFIG_DATA['path_to_upload'] . $file_name;
 
                          if (preg_match($mp3pattern, $file_name))
                           {
 
                           $getID3 = new getID3;
                           $mp3path = $_CONFIG_DATA['absolute_path'] . $file_name;
                           $mp3info = $getID3->analyze($mp3path);
                           getid3_lib::CopyTagsToComments($mp3info);
 
// @$mp3Info['comments_html']['track'][0] would give me the track number from the mp3, obviously a new/different type of loop must be created to sort, this is what i am asking for help with
 
                           $stringData = "<track>
                           <location>" . $file_path . "</location>
                           <info>" . $file_path . "</info>
                           <title>" . @$mp3info['comments_html']['track'][0] . " " . @$mp3info['tags']['id3v2']['title'][0] . " " . @$mp3info['playtime_string'] . "</title>
                           <link>http://www.aiwazz.com/mdp/</link>
                           </track>";
 
                           fwrite($fh, $stringData);
                           }
 
                }
                else{ echo '' . $file_name . ' <span class="ubrError">Failed To Upload</span>'; }
 
  }
$stringData = "</trackList>
</playlist>";
 
fwrite($fh, $stringData);
 
fclose($fh);
?>

Open in new window

0
 
Michael701Commented:
my thought is to first loop through and build an array by_track[], use ksort then do a foreach on this

$by_track[ mp3Info['comments_html']['track'][0] ] = $slot;

do you need more code?
0
 
aiwazzAuthor Commented:
Thank you for taking a look! Admittedly i am no php wiz, just getting going... A little more code would be of great benefit if you have the time to share it. I can understand the gist of were you went but might stumble implementing (havent used php's sort function before). I am at work and will be home in 2 hours to test my code.

I really appreciate your time, thanks again!
0
 
aiwazzAuthor Commented:
Just a little bit of fix, thanks for pointing out my missed bit on the filesize...

You rock. I thank you.

here's the final working code:
function createxspfplayer($_FILE_DATA, $_CONFIG_DATA, $_POST_DATA)
 
{
  
include('/path/to/getid3/getid3.php');
 
$mp3pattern = '/.mp3/i';
$jpgpattern = '/.jpg/i';
$jpegpattern = '/.jpeg/i';
$space = ' ';
$underscore = '/_/i';
$xspffile = $_CONFIG_DATA['absolute_path'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$xspfurl = $_CONFIG_DATA['path_to_upload'] . $_CONFIG_DATA['upload_id'] . ".xspf";
$fh = fopen($xspffile, 'w') or die("can't open file");
 
$stringData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<playlist version=\"0\" xmlns=\"http://xspf.org/ns/0/\">
   <trackList>";
 
fwrite($fh, $stringData);
 
foreach($_FILE_DATA as $slot => $value){
		$fname = $_FILE_DATA[$slot]->getFileInfo('name');
                               if (preg_match($jpgpattern, $fname)) {
                         $imglink = $_CONFIG_DATA['path_to_upload'] . $fname;
                    }
                    elseif (preg_match($jpegpattern, $fname)) {
                         $imglink = $_CONFIG_DATA['path_to_upload'] . $fname;
                    }
 
  }
 
foreach($_FILE_DATA as $slot => $value)
{
  $file_slot = $_FILE_DATA[$slot]->getFileInfo('slot');
  $file_name = $_FILE_DATA[$slot]->getFileInfo('name');
  $file_size = $_FILE_DATA[$slot]->getFileInfo('size');
  if($file_size > 0)
  {
    $file_path = $_CONFIG_DATA['path_to_upload'] . $file_name;
 
    if (preg_match($mp3pattern, $file_name))
    {
      $getID3 = new getID3;
      $mp3path = $_CONFIG_DATA['absolute_path'] . $file_name;
      $mp3info = $getID3->analyze($mp3path);
      getid3_lib::CopyTagsToComments($mp3info);
       
      $by_track[ @$mp3info['comments_html']['track'][0] ] = $slot;
    }
  }
}
 
ksort($by_track);
reset($by_track); // resets foreach pointer to the begining of the array
 
foreach($by_track as $track => $slot){
                $file_slot = $_FILE_DATA[$slot]->getFileInfo('slot');
                $file_name = $_FILE_DATA[$slot]->getFileInfo('name');
                $file_size = $_FILE_DATA[$slot]->getFileInfo('size');
                    if($file_size > 0){
 
                            $file_path = $_CONFIG_DATA['path_to_upload'] . $file_name;
 
                          if (preg_match($mp3pattern, $file_name))
                           {
 
                           $getID3 = new getID3;
                           $mp3path = $_CONFIG_DATA['absolute_path'] . $file_name;
                           $mp3info = $getID3->analyze($mp3path);
                           getid3_lib::CopyTagsToComments($mp3info);
 
                           $stringData = "<track>
                           <location>" . $file_path . "</location>
                           <info>" . $file_path . "</info>
                           <title>" . @$mp3info['comments_html']['track'][0] . " " . @$mp3info['tags']['id3v2']['title'][0] . " " . @$mp3info['playtime_string'] . "</title>
                           <image>";
                           fwrite($fh, $stringData);
 
                           if (isset($imglink))
                           {
                             $stringData = $imglink;
                             fwrite($fh, $stringData);
                             }
 
                           $stringData = "</image>
 
                           <link></link>
                           </track>";
 
                           fwrite($fh, $stringData);
                           }
 
                }
                else{ echo '' . $file_name . ' <span class="ubrError">Failed To Upload</span>'; }
 
  }
$stringData = "</trackList>
</playlist>";
 
fwrite($fh, $stringData);
 
fclose($fh);

Open in new window

0
 
aiwazzAuthor Commented:
perfect, thank you so much!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.