|
|
|
| Есть такой двухмерный массив
$group[] = array ('realname' => $realname, 'name' => $name, 'time' => $time, 'ext' => $ext)
|
В общем надо сделать два вида сортировки для этого массива.
Не понимаю я принцыпа работы usort().
В общем в 'ext' содержатся расширения файлов, а если это папка, то там 'folder'. Нужно чтобы сначала выводились папки по алфавиту(названия в 'name'), а потом сортировать всё просто по 'name' вне зависимости от расширения.
И второй вид сортировки, это нужно также отсортировать папки, а потом всё остальное по 'time'.
p.S. Просьба не пасылать в мануалы, я их стока перечитал... И ничё у самого не получилось. Напишите сортировки, кто может. Желательно с комментариями к каждой строчке, если не трудно. | |
|
|
|
|
|
|
|
для: zxcAq
(10.08.2007 в 02:19)
| | Переведите массив в вид
$group = array(
[folders] => array(
'Folder_Name_1' => array(
'realname' => '...',
'time' => '...'),
'Folder_Name_2' => array(
'realname' => '...',
'time' => '...'))
, [files] => array(
'File_Name_1' => array(
'realname' => '...',
'time' => '...'),
'File_Name_2' => array(
'realname' => '...',
'time' => '...')));
|
| |
|
|
|
|
|
|
|
для: Shiva
(10.08.2007 в 07:34)
| | Хм... А с тем массивом что вверху, ничё нельзя сделать? :( | |
|
|
|
|
|
|
|
для: zxcAq
(11.08.2007 в 00:19)
| | Именно с Вашим вариантом и нужно делать.
пользовательская функция порядка для первого случая будет примерно такой:
<?php
function dir_name_order($a, $b)
{
$e = $a['ext']; $ad = $e == 'folder'; $an = $a['name'];
$e = $b['ext']; $bd = $e == 'folder'; $bn = $b['name'];
$dd = $bd - $ad;
return $dd ? $dd
: strcmp($an, $bn) ;
}
usort($group, 'dir_name_order'); // применение
?>
|
функция порядка для второго случая зависит от того, записано ли время в сравнимом формате (timestamp или восточный строковый выравненный формат)
Для таймштампа она может выглядеть так:
<?php
function dir_time_name_order($a, $b)
{
$e = $a['ext']; $ad = $e =='folder'; $an = $a['name']; $at = $a['time'];
$e = $b['ext']; $bd = $e =='folder'; $bn = $b['name']; $bt = $b['time'];
$dd = $bd - $ad; $dt = $bt - $at;
return $dd ? $dd
: ($dt ? $dt
: strcmp($an, $bn));
}
usort($group, 'dir_time_name_order'); // применение
?>
|
PS. Кодер в данной ситуации не поможет. Поможет только программист. | |
|
|
|
|
|
|
|
для: Trianon
(11.08.2007 в 11:11)
| | Красиво.
А я, признаться, о функции usort и не знал. Мое почтение. | |
|
|
|
|
|
|
|
для: Trianon
(11.08.2007 в 11:11)
| | Спасибо, Trianon. Как всегда на высоте) Тока вот такая штука, если названия состоят из номеров, то он сравнивает по первой цифре) т.е "2" будет перед "10". Как это исправить? | |
|
|
|
|
|
|
|
для: zxcAq
(12.08.2007 в 00:31)
| | записывать номера в выровненной сетке. 0035 | |
|
|
|
|
|
|
|
для: Trianon
(12.08.2007 в 01:07)
| | >записывать номера в выровненной сетке. 0035
В смысле? Давать названия типа 0001? 0002? 0003...? А скриптом никак нельзя сделать натуральную сортировку? | |
|
|
|
|
|
|
|
для: zxcAq
(12.08.2007 в 01:25)
| | вместо strcmp в функции использовать strnatcmp | |
|
|
|
|
|
|
|
для: Валерий
(12.08.2007 в 09:08)
| | и потерять детерминированное поведение. | |
|
|
|
|
|
|
|
для: zxcAq
(10.08.2007 в 02:19)
| | Ну где же все кодеры... | |
|
|
|