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

Статус
В этой теме нельзя размещать новые ответы.

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);   
    }
  }
?>
 
сортировка по имени выполняется строкой:

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);
 
так как в ПХП я новичок, то сразу появились трудности :(

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

Попробовал решить проблему выводом результата в тот же файл, куда и прописываються пути картинок.
код вставил в разрыв, вот так:
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);?
Спасибо за терпение!
 
Измени этот фрагмен та этот:

Код:
$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);

и покажи вывод
 
результат:
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);
- вывод не проходил
 
Мы тестировали место, где сортируются каталоги. Сортировки имен файлов вообще не делается в этом скрипте. Для сортировки надо в функции get_folder_xml перед строкой:

PHP:
foreach ($filenames as $source)

Добавить сортировку:

PHP:
sort($filenames);
reset($filenames);
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху