Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Нюансы сортировки natsort()
Форумы портала PHP.SU » » Работа с файловой системой и файлами » Нюансы сортировки natsort()

Страниц (1): [1]
 

1. Quick - 15 Ноября, 2014 - 21:20:33 - перейти к сообщению
Ситуация следующая: сортировка массива с помощью функции natsort выводит у меня названия файлов в одной последовательности, вывод же непосредственно файлов каталога происходит в другой последовательности.
Пример:
$files = array('1.php', '10.php', '11.php','2.php', '20.php', '3.php', '4.php', '5.php');
natsort($files);
print_r($files);

Результат:
Array ( [0] => 1.php [3] => 2.php [5] => 3.php [6] => 4.php [7] => 5.php [1] => 10.php [2] => 11.php [4] => 20.php )

РНР-скрипт постраничной навигации с выводом файлов из каталога с использованием natsort:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $dirname = "catalog";
  3. $hdl = opendir($dirname);
  4.     while(($file = readdir($hdl)) !== false)
  5.     {
  6.       if(is_file($dirname."/".$file))
  7.       {
  8.       $a[]=$file;
  9.       }
  10.     }
  11. closedir($hdl);
  12. natsort($a);
  13. if(isset($_GET['list'])) $page = $_GET['list'];
  14. else $page = 1;
  15. $k=$page-1;
  16. if ($page<=count($a))
  17.       {  
  18. for($z = 1; $z <= count($a); $z++)
  19.   {
  20.       if($page == $z)
  21.       {
  22. echo $a[$z - 1];
  23.       }
  24.       else
  25.       {
  26. echo ' <a href="./dir_natsort.php?list=' . $z . '">' . $a[$z - 1] . '</a> ';
  27.       }
  28.   }
  29. }
  30. ?>
Результат:

1.php 10.php 11.php 2.php 20.php 3.php 4.php 5.php

почему такое различие в результатах сортировки?
2. Мелкий - 15 Ноября, 2014 - 21:38:40 - перейти к сообщению
Quick пишет:
Результат:
Array ( [0] => 1.php [3] => 2.php [5] => 3.php [6] => 4.php [7] => 5.php [1] => 10.php [2] => 11.php [4] => 20.php )

Мысль к размышлению.
3. Quick - 15 Ноября, 2014 - 21:46:25 - перейти к сообщению
почему тогда строки файла natsort нормально сортирует?
4. Мелкий - 15 Ноября, 2014 - 22:39:59 - перейти к сообщению
Как грустно, когда не понимают данный прямым текстом ответ Огорчение

natsort изменяет ключи массива. Вы массив выводите отсчётом цифр и обращением по ключу массива. Так почему порядок вывода должен меняться?
5. Quick - 16 Ноября, 2014 - 14:36:56 - перейти к сообщению
Опробовал скрипт навигации с natsort на хостинге, и ситуация с сортировкой стала ещё казуснее:

3.php 4.php 2.php 1.php 11.php 10.php 20.php 5.php

старт начинается с 3-го файла и далее полная неразбериха.
6. Мелкий - 16 Ноября, 2014 - 16:23:33 - перейти к сообщению
Мелкий пишет:
natsort изменяет ключи массива

Блин. Отрицание потерял.
Должно быть:
Мелкий пишет:
natsort не изменяет ключи массива

Что вообще-то отлично видно по print_r

Короче говоря, не извращайтесь. Массивы положено итерировать foreach'ом.
7. Quick - 17 Ноября, 2014 - 10:35:26 - перейти к сообщению
Если добавить в вышеприведённый РНР-скрипт такой код:
$x=1;
foreach ($a as $key=>$value)
{
echo ' <a href="./dir_natsort.php?list=' . $x++ . '"> (' .$value . ')</a> ';
}

то действительно файлы выводятся последовательно, но скрипт навигации надо переделывать.
Вопросом остаётся различие результатов выполнения скрипта на домашнем сервере и на сервере хостинга
8. Мелкий - 17 Ноября, 2014 - 10:52:48 - перейти к сообщению
А почему они должны совпадать?

http://php.net/manual/en/function.readdir.php
Цитата:
The entries are returned in the order in which they are stored by the filesystem.
9. Quick - 20 Ноября, 2014 - 14:04:31 - перейти к сообщению
Как оказалось, проблема с "ключами" легко решается с помощью регулярного выражения.
Если в РНР-скрипте после строки natsort($a); вставить две строчки:

$stra=implode(", ", $a);
$a = preg_split('/[,\s]+/u', $stra);

то foreach уже не понадобится.
10. Мелкий - 20 Ноября, 2014 - 14:07:26 - перейти к сообщению

 

Powered by ExBB FM 1.0 RC1