За последние 24 часа нас посетили 18343 программиста и 1611 роботов. Сейчас ищут 2090 программистов ...

Поясните, как работает array_multisort

Тема в разделе "Прочие вопросы по PHP", создана пользователем andreybugakov, 26 фев 2017.

  1. andreybugakov

    andreybugakov Активный пользователь

    С нами с:
    27 июн 2011
    Сообщения:
    38
    Симпатии:
    0
    Всем привет!
    Проблема решена, работает правильно, но почему оно так работает, я не понял.

    Есть многомерный древовидный массив по типу:

    Код (Text):
    1. array(100) {
    2.   [0]=>
    3.   array(11) {
    4.     ["id"]=>int(9304058)
    5.     ["from_id"]=>int(-26406986)
    6.     ["text"]=>string(3082) "много буков блаблабла"
    7.  
    8.     ["attachments"]=>
    9.          array(2) {
    10.            [0]=>
    11.            array(2) {
    12.                ["type"]=>string(5) "photo"
    13.                ["photo"]=>
    14.                array(15) {
    15.                    ["id"]=>int(456264469)
    16.                    ["album_id"]=>int(45435469)
    17.                    .................
    18.                   другие ID
    19.                   .............
    20.                  }
    21.               }
    22.           }
    23.      ["comments"]=>
    24.      array(1) {
    25.        ["count"]=>int(479)
    26.      }
    27.      ["likes"]=>
    28.      array(1) {
    29.        ["count"]=>int(469)
    30.      }
    31.      ["reposts"]=>
    32.      array(1) {
    33.        ["count"]=>int(21)
    34.      }
    35.   }
    Как видите, массив состоит из 100 элементов первого уровня, внутри идут массивы различных уровней вложенности.

    Называем массив $posts
    Его нужно отсортировать по полю $posts['likes']['count'].
    Написал такой код:

    Код (Text):
    1. foreach ($posts as $key => $post) {
    2.     $like[$key] = $post['likes']['count'];
    3. }
    4.  
    5. array_multisort($like, SORT_DESC, $posts);

    Всё работает правильно, но не пойму почему, ведь в функции переменная $posts и $like никак не связаны. Просто на вход функции поступает отсортированный одномерный массив(его имя не совпадает с именем поля в $posts) и сам $posts.

    В документации только пара слов написана и всё, толком ничего.

    А если заменить
    Код (Text):
    1. $post['likes']['count'];
    на
    Код (Text):
    1. $post['comments']['count'];
    , то сортирует по количеству комментариев.

    Откуда функция array_multisort знает, что имеено по likes, а не comments сортировать? Просто сравнением? А если эти поля будут совпадать, кроме одного значения, функция будет правильно работать?
     
  2. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Как бы вкратце и понятно объяснить.Не важно связаны эти массивы или нет.Сортировка происходит всегда по первому массиву.Если в первом массиве есть повторяющиеся элементы,то они сортируются уже следующим массивом и так далее...

    PHP:
    1. $ar1 = array(10, 100, 100, 0);
    2. $ar2 = array(1, 3, 2, 4);
    3. array_multisort($ar1, $ar2);
    4.  
    5. var_dump($ar1);
    6. var_dump($ar2);
    Отсюда и такие результаты:

    Код (Text):
    1. array(4) {
    2.   [0]=> int(0)
    3.   [1]=> int(10)
    4.   [2]=> int(100)
    5.   [3]=> int(100)
    6. }
    7. array(4) {
    8.   [0]=> int(4)
    9.   [1]=> int(1)
    10.   [2]=> int(2)
    11.   [3]=> int(3)
    12. }
    Более подробно:
    https://www.w3schools.com/php/func_array_multisort.asp
    http://phpclub.ru/manrus/f/array-multisort.html
     
  3. andreybugakov

    andreybugakov Активный пользователь

    С нами с:
    27 июн 2011
    Сообщения:
    38
    Симпатии:
    0
    PHP:
    1. $ar1 = array(10, 100, 100, 0);
    2. $ar2 = array(1, 3, 2, 4);
    в этих массивах нет одинаковых значений. Почему 4 выходит на первое место во втором массиве после сортировки? Если по возрастанию. то она должна быть последней..
     
    #3 andreybugakov, 26 фев 2017
    Последнее редактирование модератором: 26 фев 2017
  4. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    PHP:
    1. $ar1 = array(10, 100, 100, 0);
    2. $ar2 = array(1, 3, 2, 4);
    4 выходит на первое место,потому что в первом массиве на первое место выходит 0.По возрастанию сортируются одинаковые значения.Одинаковые значения есть в первом массиве.Соответственно они сортируются уже по второму массиву.