Проблема с сортировкой, нужна помощь

Тема в разделе "PHP", создана пользователем l2net, 9 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. l2net

    l2net Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    32
    Симпатии:
    4
    Здравствуйте!
    Ситуация следующая:

    скрипт (файл buildGalleries.php) получает указание на выполнение и некоторые настройки из флеша после чего должен перебрать все папки и файлы в них из папки галереи (общая папка - galleries, а в ней могут быть еще подразделы галереи) и записать пути всех лежащих там картинок в файл gallery.xml в определеной последовательности по имени, по дате или в случайном порядке (переменная сортировки приходит из флеша), но при любом значении этой переменной сортировка не выполняется. Пожалуйста помогите настроить сортировку последовательности записи, хотябы по имени файла.

    Заранее спасибо! и извиняюсь если не совсем понятно изложил

    Запись в файл gallery.xml происходит в формате:
    PHP:
    <?xml version="1.0" encoding="utf-8"?>
    <galleries>
    <gallery>
    <title>Wedding</title>
     <images>
    <image src="galleries/Wedding/0022.jpg" thumb="galleries/Wedding/thumbs/0022.jpg">0022</image>
     </images>
    </gallery>
    </galleries>
    Код файла buildGalleries.php
    PHP:
    <?php
    $sortorder 
    =  $_REQUEST["sortorder"];
    $indir "../galleries";
    $files opendir($indir);
    $outxml "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n";
    $outxml .= "<galleries>\n\n";    
    while (
    $file readdir($files)) {
      if(
    is_dir($indir.'/'.$file))
      if (
    $file != '.' && $file != '..') {
        {
            
    $tmp_outxml[] = $file;
        }
        }
      }
    if (
    $sortorder == "date")
    {
        foreach (
    $tmp_outxml as $k => $v)
        {
            
    $modified filemtime ($indir.'/'.$v);
            
    $moddate[$k] = $modified;
        }
        
    array_multisort ($moddate$tmp_outxml);
    }
    else if (
    $sortorder == "random")
    {
        
    shuffle ($tmp_outxml);
    }
    else
    {
        
    sort ($tmp_outxml);
    }
    foreach (
    $tmp_outxml as $v)
    {
        
    $outxml .= get_folder_xml($indir.'/'.$v,$v);
    }
    $outxml .= "</galleries>";

    closedir($files);  
    $fp fopen("../xml/gallery/gallery.xml""w");
    fwrite($fp$outxml);
    fclose($fp);


    function 
    get_folder_xml($imageDir,$title)
      {

      
    $extensions = array(".jpg"".jpeg"".JPG",".JPEG",".gif",".GIF",".swf",".SWF");
      
    $output "";
      
      if(
    $folder opendir($imageDir))
        {
        
    $filenames=array();
            
        while (
    false !== ($file readdir($folder)))
          {
          
    $dot strrchr($file'.');
          if(
    in_array($dot$extensions))
            {
            
    array_push($filenames$file);
            }         
          }
         
    $spaceTitle str_replace("_"," ",$title);
         
    $newPath str_replace("../","",$imageDir);

        
    $output .= "<gallery>\n";
         
    $output .= "<title>$spaceTitle</title>\n";
        
    $output .= " <images>\n";
        foreach (
    $filenames as $source)
          {
          
    $imageName str_replace("mainThumb_","",$source);
          
    $finalName str_replace("_"," ",$imageName);
        
          
    $imageName str_replace($extensions,"",$finalName);
          
    $output .= "\t <image src=\"$newPath/$source\" thumb=\"$newPath/thumbs/$source\">$imageName</image>\n";
          }
       
    $output .= " </images>\n";
       
    $output .= "</gallery>\n\n";
    return 
    $output;
         
        
    closedir($folder);   
        }
      }
    ?>
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    сортировка по имени выполняется строкой:

    PHP:
    sort ($tmp_outxml);
    Выведи содержимое массива до сортировки и после. Приведи, что получилось.

    PHP:
    echo '<br>before sort:<br>';
    print_r($tmp_outxml);
    sort ($tmp_outxml);
    echo 
    '<br>before sort:<br>';
    print_r($tmp_outxml);
     
    l2net нравится это.
  3. l2net

    l2net Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    32
    Симпатии:
    4
    так как в ПХП я новичок, то сразу появились трудности :(

    просто вывести резельтат работы ПХП я не могу т.к. переменные посылемые из флеша не поступают.

    Попробовал решить проблему выводом результата в тот же файл, куда и прописываються пути картинок.
    код вставил в разрыв, вот так:
    PHP:
       $output .= " </images>\n";
       
    $output .= "</gallery>\n\n";

     
    $output .=  '<br>before sort:<br>'
     
    $output .= print_r($tmp_outxml);
    sort ($tmp_outxml); 
     
    $output .=  '<br>agter sort:<br>'
     
    $output .= print_r($tmp_outxml);  
       
    return 
    $output;

        
    closedir($folder);   
    но в итоге результат такой же как и был до этого - абсолютно несистематизированная последовательность
    Возможно проблемма в sort ($tmp_outxml);?
    Спасибо за терпение!
     
  4. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Измени этот фрагмен та этот:

    Код:
    $output .= " </images>\n"; 
    $output .= "</gallery>\n\n"; 
    
    [B]reset[/B]($tmp_outxml);
    $output .=  '<br>before sort:<br>';  
    $output .= print_r($tmp_outxml, [B]true[/B]); 
    [B]reset[/B]($tmp_outxml);
    sort ($tmp_outxml);  
    [B]reset[/B]($tmp_outxml);
    $output .=  '<br>agter sort:<br>';  
    $output .= print_r($tmp_outxml,[B]true[/B]);   
    [B]reset[/B]($tmp_outxml);
    и покажи вывод
     
    l2net нравится это.
  5. l2net

    l2net Создатель

    Регистр.:
    8 сен 2008
    Сообщения:
    32
    Симпатии:
    4
    результат:
    PHP:
    <?xml version="1.0" encoding="utf-8"?>

    <galleries>

    <gallery>
    <title>Wedding</title>
     <images>
         <image src="galleries/Wedding/004.jpg" thumb="galleries/Wedding/thumbs/004.jpg">004</image>
         <image src="galleries/Wedding/052.jpg" thumb="galleries/Wedding/thumbs/052.jpg">052</image>
         <image src="galleries/Wedding/023.jpg" thumb="galleries/Wedding/thumbs/023.jpg">023</image>
         <image src="galleries/Wedding/mainThumb_060.jpg" thumb="galleries/Wedding/thumbs/mainThumb_060.jpg">060</image>
         <image src="galleries/Wedding/063.jpg" thumb="galleries/Wedding/thumbs/063.jpg">063</image>
        
     </images>
    </gallery>

    <br>before sort:<br><br>agter sort:<br><gallery>
    <title>Wedding book</title>
     <images>
         <image src="galleries/Wedding_book/Book049.jpg" thumb="galleries/Wedding_book/thumbs/Book049.jpg">Book049</image>
         <image src="galleries/Wedding_book/Book043.jpg" thumb="galleries/Wedding_book/thumbs/Book043.jpg">Book043</image>
         <image src="galleries/Wedding_book/Book044.jpg" thumb="galleries/Wedding_book/thumbs/Book044.jpg">Book044</image>
         <image src="galleries/Wedding_book/Book047.jpg" thumb="galleries/Wedding_book/thumbs/Book047.jpg">Book047</image>
         <image src="galleries/Wedding_book/Book037.jpg" thumb="galleries/Wedding_book/thumbs/Book037.jpg">Book037</image>

     </images>
    </gallery>

    <br>before sort:<br><br>agter sort:<br><gallery>
    <title>*Other</title>
     <images>
         <image src="galleries/*Other/004.jpg" thumb="galleries/*Other/thumbs/004.jpg">004</image>
         <image src="galleries/*Other/003.jpg" thumb="galleries/*Other/thumbs/003.jpg">003</image>
         <image src="galleries/*Other/005.jpg" thumb="galleries/*Other/thumbs/005.jpg">005</image>
         <image src="galleries/*Other/mainThumb_002.jpg" thumb="galleries/*Other/thumbs/mainThumb_002.jpg">002</image>
         <image src="galleries/*Other/006.jpg" thumb="galleries/*Other/thumbs/006.jpg">006</image>
         <image src="galleries/*Other/001.jpg" thumb="galleries/*Other/thumbs/001.jpg">001</image>
     </images>
    </gallery>

    <br>before sort:<br><br>agter sort:<br></galleries>
    если после Вашегео куска кода не прописать
    PHP:
    return $output;

        
    closedir($folder);   
    - вывод не проходил
     
  6. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    Мы тестировали место, где сортируются каталоги. Сортировки имен файлов вообще не делается в этом скрипте. Для сортировки надо в функции get_folder_xml перед строкой:

    PHP:
    foreach ($filenames as $source
    Добавить сортировку:

    PHP:
    sort($filenames);
    reset($filenames);
     
    l2net нравится это.
Статус темы:
Закрыта.