Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сортировка двумерного массива
 
 автор: zxcAq   (10.08.2007 в 02:19)   письмо автору
 
 

Есть такой двухмерный массив

$group[] = array ('realname' => $realname, 'name' => $name, 'time' => $time, 'ext' => $ext)

В общем надо сделать два вида сортировки для этого массива.
Не понимаю я принцыпа работы usort().
В общем в 'ext' содержатся расширения файлов, а если это папка, то там 'folder'. Нужно чтобы сначала выводились папки по алфавиту(названия в 'name'), а потом сортировать всё просто по 'name' вне зависимости от расширения.
И второй вид сортировки, это нужно также отсортировать папки, а потом всё остальное по 'time'.

p.S. Просьба не пасылать в мануалы, я их стока перечитал... И ничё у самого не получилось. Напишите сортировки, кто может. Желательно с комментариями к каждой строчке, если не трудно.

   
 
 автор: Shiva   (10.08.2007 в 07:34)   письмо автору
 
   для: 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'          => '...')));

   
 
 автор: zxcAq   (11.08.2007 в 00:19)   письмо автору
 
   для: Shiva   (10.08.2007 в 07:34)
 

Хм... А с тем массивом что вверху, ничё нельзя сделать? :(

   
 
 автор: Trianon   (11.08.2007 в 11:11)   письмо автору
 
   для: 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. Кодер в данной ситуации не поможет. Поможет только программист.

   
 
 автор: Shiva   (11.08.2007 в 17:03)   письмо автору
 
   для: Trianon   (11.08.2007 в 11:11)
 

Красиво.
А я, признаться, о функции usort и не знал. Мое почтение.

   
 
 автор: zxcAq   (12.08.2007 в 00:31)   письмо автору
 
   для: Trianon   (11.08.2007 в 11:11)
 

Спасибо, Trianon. Как всегда на высоте) Тока вот такая штука, если названия состоят из номеров, то он сравнивает по первой цифре) т.е "2" будет перед "10". Как это исправить?

   
 
 автор: Trianon   (12.08.2007 в 01:07)   письмо автору
 
   для: zxcAq   (12.08.2007 в 00:31)
 

записывать номера в выровненной сетке. 0035

   
 
 автор: zxcAq   (12.08.2007 в 01:25)   письмо автору
 
   для: Trianon   (12.08.2007 в 01:07)
 

>записывать номера в выровненной сетке. 0035
В смысле? Давать названия типа 0001? 0002? 0003...? А скриптом никак нельзя сделать натуральную сортировку?

   
 
 автор: Валерий   (12.08.2007 в 09:08)   письмо автору
 
   для: zxcAq   (12.08.2007 в 01:25)
 

вместо strcmp в функции использовать strnatcmp

   
 
 автор: Trianon   (12.08.2007 в 12:11)   письмо автору
 
   для: Валерий   (12.08.2007 в 09:08)
 

и потерять детерминированное поведение.

   
 
 автор: zxcAq   (11.08.2007 в 01:58)   письмо автору
 
   для: zxcAq   (10.08.2007 в 02:19)
 

Ну где же все кодеры...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования