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

Форум PHP

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

 

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

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

тема: Сортировка массива
 
 автор: Jaroslav   (28.06.2010 в 15:01)   письмо автору
 
 

Здравствуйте.

Подскажите, пожалуйста.
Есть, например, такой массив:



Array
(
    [660348] => Array
        (
            [660358] => 660358
            [660357] => 660357
        )

    [660346] => Array
        (
            [660348] => 660348
        )

    [0] => Array
        (
            [660346] => 660346
            [655769] => 655769
            [654921] => 654921
        )

    [602560] => Array
        (
            [659624] => 659624
            [602577] => 602577
        )

)





задача стоит такая.
необходимо его отсортировать так, чтобы элементы массива, если их несколько, были в порядке убывания. Причём, если это [0] - то его не трогать..

Т.е. на выходе должен быть массив:





Array
(
    [660348] => Array
        (
            [660357] => 660357
            [660358] => 660358
        )

    [660346] => Array
        (
            [660348] => 660348
        )

    [0] => Array
        (
            [660346] => 660346
            [655769] => 655769
            [654921] => 654921
        )

    [602560] => Array
        (
            [602577] => 602577
            [659624] => 659624
        )

)

  Ответить  
 
 автор: Valick   (28.06.2010 в 15:41)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 15:01)
 

во вложенных массивах (ключах и значениях) тоже может встречаться 0? и его тоже нужно не трогать? или 0 может быть только в ключах внешнего массива?

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 15:43)   письмо автору
 
   для: Valick   (28.06.2010 в 15:41)
 

во вложенных 0 - не может быть. Но сама вложенность может быть неограниченной.

  Ответить  
 
 автор: Valick   (28.06.2010 в 15:46)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 15:43)
 

кстати ключи внешнего массива у вас в порядке убывания, а ключи вложенного массива в порядке возростания, опеределитесь с заданием поконкретнее
точнее только первого, второй правильно... это просто ошибка?

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 15:58)   письмо автору
 
   для: Valick   (28.06.2010 в 15:46)
 

это не ошибка, так и должно быть.
Т.е. была рекурсия.

Обычно записи выводятся так:



- сообщение 1
- сообщение 2
- сообщение 3
----- сообщение 4
----- сообщение 5
- сообщение 6
- сообщение 7
----- сообщение 8
----- сообщение 9
----- сообщение 10
- сообщение 11



при этом последние сообщения первого уровня - внизу.
Необходимо, чтобы вывод был так:




- сообщение 11
- сообщение 7
----- сообщение 8
----- сообщение 9
----- сообщение 10
- сообщение 6
- сообщение 3
----- сообщение 4
----- сообщение 5
- сообщение 2
- сообщение 1

  Ответить  
 
 автор: Valick   (28.06.2010 в 16:06)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 15:58)
 

т.о. нужно ключи внешнего массива отсортировать в порядке убывания, а ключи всех вложенных массивов в порядке возростания, так?
ноль следует просто оставлять на своем месте, а его содержимое оставлять как есть, так?

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 16:13)   письмо автору
 
   для: Valick   (28.06.2010 в 16:06)
 

вроде так.

  Ответить  
 
 автор: Valick   (28.06.2010 в 16:21)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 16:13)
 

Вы что не можете четко сформулировать правило сортировки?
Вы сами сказали что вложенность массива может быть неограничена, в первом посте это не отображено.
Если Вам впадлу ответить на наводящие вопросы, то делайте сами, а то у меня складывается впечатление, что это нужно мне а не Вам
И если быть до конца честным желание Вам помогать уже пропало.

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 16:25)   письмо автору
 
   для: Valick   (28.06.2010 в 16:21)
 

потому что вы неправильно пишите. А я уже объяснил 2 раза одно и тоже.

Надо так, чтобы если в одной категории (рубрике) - элементов больше 1, то их отсортировать в порядке возрастания. Если 1 элемент или это рубрика первого уровня с нулём, тогда ничего не трогать. И по первому посту это видно.

  Ответить  
 
 автор: Valick   (28.06.2010 в 16:27)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 16:25)
 

нулей я так понимаю может быть сколь угодно много?
____
потому что вы неправильно пишите
буду писать правильно как только научусь читать мысли )

  Ответить  
 
 автор: Valick   (28.06.2010 в 16:37)   письмо автору
 
   для: Valick   (28.06.2010 в 16:27)
 

торможу... не может быть... ноль может быть только один.

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 16:40)   письмо автору
 
   для: Valick   (28.06.2010 в 16:27)
 

нет, массив нулевого уровня только 1 (ОДИН).
Структура примерно такая:


Array
(
    [660348] => Array
        (
            [660358] => 660358
            [660357] => 660357
        )

    [660346] => Array
        (
            [660348] => 660348
        )

    [0] => Array
        (
            [660346] => 660346
            [655769] => 655769
            [654921] => 654921
        )

    [602560] => Array
        (
            [659624] => 659624
            [602577] => 602577
        )

)



вложенность может быть только 1-го и 2-го уровня. (писал неограниченная - ошибся, извиняюсь).
Задача такая. Если это массив 1-го уровня вложенности и не является [0], то элементы внутри него надо отсортировать в порядке возрастания. Понятно написал? :)

  Ответить  
 
 автор: sim5   (28.06.2010 в 16:51)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 16:40)
 

<?
$a 
= array( 
  
660348=>array( 
    
660358 => 660358,
    
660357 => 660357 
  
), 
  
660346=>array( 
    
660348 => 660348 
  
), 
  
=> array( 
    
660346 => 660346
    
655769 => 655769
    
654921 => 654921 
  
), 
  
602560=>array( 
    
659624 => 659624,
    
602577 => 602577 
  

);
foreach(
$a as $key=>$val) if($keyasort($a[$key]);
echo 
'<pre>';
print_r($a);

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 16:57)   письмо автору
 
   для: sim5   (28.06.2010 в 16:51)
 

большое спасибо!

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:07)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 16:57)
 

эттот код сортирует вложенные массивы, причем и нулевой элемент в том чилсе, оставляе внешний массив как есть.
или я уже сошёл с ума, но пока еще не смирился с этой мыслью?

  Ответить  
 
 автор: sim5   (28.06.2010 в 17:09)   письмо автору
 
   для: Valick   (28.06.2010 в 17:07)
 

Массив с ключем равным 0 не сортируется.

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:10)   письмо автору
 
   для: sim5   (28.06.2010 в 17:09)
 

да верно
но внешний массив остается таким как и был

  Ответить  
 
 автор: sim5   (28.06.2010 в 17:12)   письмо автору
 
   для: Valick   (28.06.2010 в 17:10)
 

А вам что надо? Как автор просил (по примеру чуть выше), так и отсортировано.

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:13)   письмо автору
 
   для: sim5   (28.06.2010 в 17:12)
 

мне ничего не надо... честно :)
если это то что нужно автору, то пусть так и будет
на всякий случай посмотрите пятый пост

  Ответить  
 
 автор: sim5   (28.06.2010 в 17:19)   письмо автору
 
   для: Valick   (28.06.2010 в 17:13)
 

Если смотреть на пятый, то похоже взято из базы, а коли так, то сортировку задавать надо в запросе, и коли вычурную, то загодя определять ее в таблице.

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:22)   письмо автору
 
   для: sim5   (28.06.2010 в 17:19)
 

в задании у автора массив уже отсортированный в порядке убывания (не принимая во внимание ноль)
и вот слова автора
задача стоит такая.
необходимо его отсортировать так, чтобы элементы массива, если их несколько, были в порядке убывания. Причём, если это [0] - то его не трогать..

естественно я предположил, что входной массив может иметь произвольный порядок, в противном случае задание бы звучало совсем иначе.

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:32)   письмо автору
 
   для: sim5   (28.06.2010 в 17:19)
 

более того присмотритесть вот Ваш код
foreach($a as $key=>$val) if($key) asort($a[$key]);
а вот то что я написал словами

  Ответить  
 
 автор: sim5   (28.06.2010 в 17:34)   письмо автору
 
   для: Valick   (28.06.2010 в 17:32)
 

Что вас не устраивает?

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:38)   письмо автору
 
   для: sim5   (28.06.2010 в 17:34)
 

все ладно, проехали...

  Ответить  
 
 автор: Jaroslav   (28.06.2010 в 17:39)   письмо автору
 
   для: Valick   (28.06.2010 в 17:32)
 

sim5 - подсказал всё правильно.. Работает идеально. И правильно написал, что массив взят из базы и изначально уже был отсортирован.

  Ответить  
 
 автор: sim5   (28.06.2010 в 17:42)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 17:39)
 

Так и сортируйте сразу в запросе, чтобы получать уже отсортированный ресурс. Если нужна нестандартная сортировака, то создайте поле, по которому и будет происходить сортировка.
Зачем же потом сортировать?

  Ответить  
 
 автор: Valick   (28.06.2010 в 17:50)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 17:39)
 

рботает-то он идеально, и даже более того работает так как хотели Вы, но не соответствует заданию которое Вы написали словами.
Я и начал задавать вопросы дополнительные, потому что словесное задание и пример массива не соответствовали друг другу

  Ответить  
 
 автор: Valick   (28.06.2010 в 16:58)   письмо автору
 
   для: Jaroslav   (28.06.2010 в 16:40)
 

вся задача сводиться к определению положения нуля
пробегаемся по массиву, сортируя вложенные массивы в порядке возрастания стандартной функцией, находим и запоминаем порядковый номер с нулевым элементом массива (и не сортируем его).
потом так же сортируем стандартной функцией внешний массив в порядке убывания, нулевой элемент оказывается внизу
теперь задача сводиться к тому, чтобы поднять этот элемент на свое место...
стоп.... есть опять нюансы... это годиться для того случая если массив до этого был отсортирован по возростанию.... чет я слегка запарился

  Ответить  
Rambler's Top100
вверх

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