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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Нюансы сортировки natsort()

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Сортировка файлов каталога
Quick
Отправлено: 15 Ноября, 2014 - 21:20:33
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Ситуация следующая: сортировка массива с помощью функции 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

почему такое различие в результатах сортировки?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Ноября, 2014 - 21:38:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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 )

Мысль к размышлению.


-----
PostgreSQL DBA
 
 Top
Quick
Отправлено: 15 Ноября, 2014 - 21:46:25
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




почему тогда строки файла natsort нормально сортирует?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Ноября, 2014 - 22:39:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Как грустно, когда не понимают данный прямым текстом ответ Огорчение

natsort изменяет ключи массива. Вы массив выводите отсчётом цифр и обращением по ключу массива. Так почему порядок вывода должен меняться?


-----
PostgreSQL DBA
 
 Top
Quick
Отправлено: 16 Ноября, 2014 - 14:36:56
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Опробовал скрипт навигации с natsort на хостинге, и ситуация с сортировкой стала ещё казуснее:

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

старт начинается с 3-го файла и далее полная неразбериха.

(Отредактировано автором: 19 Ноября, 2014 - 09:42:07)

 
 Top
Мелкий Супермодератор
Отправлено: 16 Ноября, 2014 - 16:23:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Мелкий пишет:
natsort изменяет ключи массива

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

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

Короче говоря, не извращайтесь. Массивы положено итерировать foreach'ом.


-----
PostgreSQL DBA
 
 Top
Quick
Отправлено: 17 Ноября, 2014 - 10:35:26
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Если добавить в вышеприведённый РНР-скрипт такой код:
$x=1;
foreach ($a as $key=>$value)
{
echo ' <a href="./dir_natsort.php?list=' . $x++ . '"> (' .$value . ')</a> ';
}

то действительно файлы выводятся последовательно, но скрипт навигации надо переделывать.
Вопросом остаётся различие результатов выполнения скрипта на домашнем сервере и на сервере хостинга

(Отредактировано автором: 17 Ноября, 2014 - 10:53:07)

 
 Top
Мелкий Супермодератор
Отправлено: 17 Ноября, 2014 - 10:52:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А почему они должны совпадать?

http://php.net/manual/en/function.readdir.php
Цитата:
The entries are returned in the order in which they are stored by the filesystem.


-----
PostgreSQL DBA
 
 Top
Quick
Отправлено: 20 Ноября, 2014 - 14:04:31
Post Id


Новичок


Покинул форум
Сообщений всего: 25
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




Как оказалось, проблема с "ключами" легко решается с помощью регулярного выражения.
Если в РНР-скрипте после строки natsort($a); вставить две строчки:

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

то foreach уже не понадобится.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2014 - 14:07:26
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)






-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB