Сортировка массивов

Тема в разделе "Обо всём", создана пользователем zema50, 11 ноя 2022.

  1. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    835
    Симпатии:
    94
    добрый день, помогите плиз с сортировкой, что то туплю и никак не могу решить задачу,
    есть выборка атрибутов конкретных товаров у которых есть одинаковые и разные значение атрибутов, нужно отсортировать что бы остались только одинаковые, то есть к примеру 2 товара вот с такими атрибутами
    Код:
    Array
    (
        [0] => Array
            (
                [attribute_id] => 49
                [name] => Код Viega
                [text] => 746827
            )
    
        [1] => Array
            (
                [attribute_id] => 40
                [name] => Ду, дюйм
                [text] => 1/2
            )
    
        [2] => Array
            (
                [attribute_id] => 21
                [name] => Материал корпуса
                [text] => Бронза кремниевая
            )
    
        [3] => Array
            (
                [attribute_id] => 23
                [name] => Материал шара
                [text] => Сталь нержавеющая
            )
    
        [4] => Array
            (
                [attribute_id] => 13
                [name] => Применение
                [text] => Водоснабжение, теплоснабжение
            )
    
        [5] => Array
            (
                [attribute_id] => 15
                [name] => Присоединение
                [text] => Резьба
            )
    
    )
    Array
    (
        [0] => Array
            (
                [attribute_id] => 49
                [name] => Код Viega
                [text] => 746829
            )
    
        [1] => Array
            (
                [attribute_id] => 40
                [name] => Ду, дюйм
                [text] => 3/4
            )
    
        [2] => Array
            (
                [attribute_id] => 21
                [name] => Материал корпуса
                [text] => Бронза кремниевая
            )
    
        [3] => Array
            (
                [attribute_id] => 23
                [name] => Материал шара
                [text] => Сталь нержавеющая
            )
    
        [4] => Array
            (
                [attribute_id] => 13
                [name] => Применение
                [text] => Водоснабжение, теплоснабжение
            )
    
        [5] => Array
            (
                [attribute_id] => 15
                [name] => Присоединение
                [text] => Резьба
            )
    
    )
    на выходе должны получить массив
    Код:
    Array
    (
         [0] => Array
            (
                [attribute_id] => 21
                [name] => Материал корпуса
                [text] => Бронза кремниевая
            )
    
        [1] => Array
            (
                [attribute_id] => 23
                [name] => Материал шара
                [text] => Сталь нержавеющая
            )
    
        [2] => Array
            (
                [attribute_id] => 13
                [name] => Применение
                [text] => Водоснабжение, теплоснабжение
            )
    
        [3] => Array
            (
                [attribute_id] => 15
                [name] => Присоединение
                [text] => Резьба
            )
    
    )
    спасибо
     
  2. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Если данных немного, то просто сделайте массив, в который добавляйте атрибуты поочередно из массивов и проверяйте, что если было раньше, то увеличивайте счетчик у соответствующего элемента, а затем делайте выборку только с количеством больше 1 (не особо оптимально, зато понятно). Иначе открываете Кнут (Большая книга с алгоритмами).
     
  3. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    835
    Симпатии:
    94
    пробовал типа такого, есть группы у которых много товаров и куча атрибутов, начинаются тормоза да и костыльно все как то получается (
     
  4. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    А чего не переложить на БД? Там многие алгоритмы уже в нормальном виде. Т.е. делать выборку по совпадению.
     
  5. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    835
    Симпатии:
    94
    то же пытался, но тоже не вышло. правда тыркался уже с базой ночью, возможно ступил что то.
     
  6. Blast

    Blast Продвинутый пользователь

    Сообщения:
    212
    Симпатии:
    74
    Код:
    $a3 = array_uintersect($a1, $a2, function($a, $b){
       return $a <=> $b;
    });
     
  7. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    835
    Симпатии:
    94
    спасибо, чуть позже протестю
     
  8. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    740
    Симпатии:
    100
    Можно еще иной подход. Сортируете данные по id (или выборка с сортиовкой из БД). Затем делаете два указателя. И начинаете двигать по обоим массивам сверху вниз от меньшего id к большему. Если происходит пересечение элемента, то добавляете в результат. Такой алгортим даст производительность O(n) (без учета сортировки, но если из БД тягать, то там быстрые алгоритмы).

    Движение при этом по шагу. Чей id меньше тот и сдвигаете дальше.
     
  9. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    835
    Симпатии:
    94
    решил вопрос выборкой из базы, все работает быстро )