За последние 24 часа нас посетили 21990 программистов и 1103 робота. Сейчас ищет 731 программист ...

Сортировка значений массива по определенному шаблону

Тема в разделе "PHP для профи", создана пользователем Deonis, 11 окт 2017.

Метки:
  1. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Приветствую! Суть: Необходимо отсортировать двумерный массив по шаблону, в качестве которого выступает другой массив. Размеры массивов в 99.99% всегда разные. В примере ниже, нужно отсортировать по колонке 'status' так, чтобы их значения соответствовали порядку значений в массиве-шаблоне:
    PHP:
    1. <?php
    2. // Входящие данные.
    3. $data = [
    4.     ['id' => 10, 'status' => 3,],
    5.     ['id' => 20, 'status' => 4,],
    6.     ['id' => 30, 'status' => 4,],
    7.     ['id' => 40, 'status' => 2,]
    8. ];
    9. // Шаблон для сортировки
    10. $template = [4, 2, 1, 5, 3, 0];
    11.  
    12. // Желаемый результат
    13. $data = [
    14.     ['id' => 20, 'status' => 4,],
    15.     ['id' => 30, 'status' => 4,],
    16.     ['id' => 40, 'status' => 2,],
    17.     ['id' => 10, 'status' => 3,]
    18. ];
    На текущий момент решил эту задачу следующим образом:
    PHP:
    1. <?php
    2. $template = array_combine($template, array_fill(0, count($template), []));
    3. foreach($data as $v) {
    4.     $template[$v['status']][] = $v;
    5. }
    6. $data = call_user_func_array('array_merge', array_filter($template));
    Залипающие глаза и сонный мозг не дают покоя, что это можно сделать гораздо проще, с меньшими телодвижениями, но с какой тут еще стороны можно подойти - сообразить не могу. Подкиньте идейку, плиззз.
     
  2. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    PHP:
    1. uasort($data, function($a, $b) use($template){
    2.     return array_search($a['status'], $template) <=> array_search($b['status'], $template);
    3. });
     
    acso, mahmuzar, TeslaFeo и ещё 1-му нравится это.
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Гуд! Вот что значит свежий взгляд ;)
     
  4. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Не самый свежий. Попробуй array_flip($template) и по индексу вместо array_search. Добавь проверок.
    Я прост в последние 5 минут рабочего времени запилил, а ща вот подумал.
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    не важно. Можно было даже просто сказать, мол: "Чувак, вспомни про индексы" и мне бы этого было достаточно. После бессонной ночи заклинило меня в другую степь, а слово "индексы" - протрезвило :)
     
  6. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Подскажите пожалуйста на php 7.2 какой самый простой метод сортировки по шаблону на данный момент? Статьи все старые, кажется там все мудрено. Например есть такой шаблон:
    PHP:
    1. $template = [
    2.     '45395044-B009-44E6-9A2C-F5B5378EC9F1',
    3.     '44422D54-18F6-4BD0-A860-E973AFB1DFA6',
    4.     '9ECB9FD0-9FE4-4C93-ACA3-068992CEDB78',
    5.     '2DE5F53E-7A2F-479D-9525-9B293753E3B8',
    6.     '0188F2BD-950D-443D-BCB1-9D80F74E67BF',
    7.     '114789C8-6524-4C4E-9E63-B08A378353F8',
    8.     '0C08CE22-5E25-46AB-9062-464492B33C7B',
    9.     '25F89090-C8DA-4981-AE66-5118FEF8A297',
    10.     '396F0971-01C1-45EE-8B29-B43ABA539EF7'
    11. ];
    и результат запроса (в запросе нет возможности отсортировать) :
    PHP:
    1. operationId                            |  stepOperationId
    2. 45395044-B009-44E6-9A2C-F5B5378EC9F1   |  BD4FAC73-98C1-4AB1-9722-DA77EBC1C618
    3. 45395044-B009-44E6-9A2C-F5B5378EC9F1   |  B5284E7B-9ED4-4347-BF7B-7E86842911B0
    4. 45395044-B009-44E6-9A2C-F5B5378EC9F1   |  7BD446E3-E60B-49B6-8C0E-557D20B573AC
    5. 45395044-B009-44E6-9A2C-F5B5378EC9F1   |  4B2CFC51-388E-4DF7-8051-B694C89ECD49
    6. 45395044-B009-44E6-9A2C-F5B5378EC9F1   |  17DC6CB1-CA86-461A-AA4B-CD9AE5F51FE7
    7. 114789C8-6524-4C4E-9E63-B08A378353F8   |  BD4FAC73-98C1-4AB1-9722-DA77EBC1C618
    8. 114789C8-6524-4C4E-9E63-B08A378353F8   |  4B2CFC51-388E-4DF7-8051-B694C89ECD49
    9. 114789C8-6524-4C4E-9E63-B08A378353F8   |  17DC6CB1-CA86-461A-AA4B-CD9AE5F51FE7
    10. 0188F2BD-950D-443D-BCB1-9D80F74E67BF   |  7BD446E3-E60B-49B6-8C0E-557D20B573AC
    11. 0188F2BD-950D-443D-BCB1-9D80F74E67BF   |  17DC6CB1-CA86-461A-AA4B-CD9AE5F51FE7
    12. 0188F2BD-950D-443D-BCB1-9D80F74E67BF   |  9AB2C898-993B-4C6A-8B83-8CFAE5674B6F
    13. 0188F2BD-950D-443D-BCB1-9D80F74E67BF   |  68040243-92D7-46C1-A356-18509C7CEB17
    надо отсортировать колонку operationId по шалбону $template.

    Пока ищу возможные простые варианты, может кто знает как проще всего?
     
  7. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    у меня получилась такая фигня:
    PHP:
    1. $form // результат запроса
    2. $template = [
    3.     '45395044-B009-44E6-9A2C-F5B5378EC9F1',
    4.     '44422D54-18F6-4BD0-A860-E973AFB1DFA6',
    5.     '9ECB9FD0-9FE4-4C93-ACA3-068992CEDB78',
    6.     '2DE5F53E-7A2F-479D-9525-9B293753E3B8',
    7.     '0188F2BD-950D-443D-BCB1-9D80F74E67BF',
    8.     '114789C8-6524-4C4E-9E63-B08A378353F8',
    9.     '0C08CE22-5E25-46AB-9062-464492B33C7B',
    10.     '25F89090-C8DA-4981-AE66-5118FEF8A297',
    11.     '396F0971-01C1-45EE-8B29-B43ABA539EF7'
    12. ];
    13. $result = [];
    14. foreach($template as $value){
    15.     $array = array_keys(array_column($form, 'operationId'), $value);
    16.     if(count($array) !== 0){
    17.         foreach ($array as $int){
    18.             $result[] = $form[$int];
    19.         }
    20.     }
    21. }
    22. return $result;
    как то не очень.