За последние 24 часа нас посетили 52411 программистов и 1798 роботов. Сейчас ищут 756 программистов ...

Сравнение 2-х массивов по переменно

Тема в разделе "PHP для новичков", создана пользователем espltd, 23 ноя 2016.

  1. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    Доброго всем дня! Помогите пожалуйста разобраться в сравнении 2-х массивов по опр. полю. Дело в том, что подобное никогда не делал, пытался сделать и циклом в цикле в цикле и одним циклом присваивая ключ первого массива итым для второго и таким образом пытался сравнивать. 3-ий день бьюсь, но ни как не могу понять как это сделать правильно. Цикл в цикле да под циклом:D как-то не самый лучший вариант. Хочется именно оптимизировано сделать - грамотно. Но озадачен этим впервые. Есть непонимание(( По возможности просьба помочь если кто сталкивался и знает. Есть у меня массив объектов вида:

    Код (Text):
    1. Array
    2. (
    3.     [0] => ComplectOption Object
    4.         (
    5.             ['compl'] => Array
    6.                 (
    7.                     [complectation_id] => 189
    8.                     [title_group] => Дизайн
    9.                     [title_option] => Бамперы в цвет кузова
    10.                     [pole] => Б
    11.                 )
    12.         )
    13.  
    14.     [1] => ComplectOption Object
    15.         (
    16.             ['compl'] => Array
    17.                 (
    18.                     [complectation_id] => 189
    19.                     [title_group] => Дизайн
    20.                     [title_option] => Решетка радиатора черного цвета
    21.                     [pole] => -
    22.                 )
    23.         )
    24. )
    Интересует именно сравнение по одному полю. Т.е. в одном есть такая штука - ставим +, а в другом нет -, а если и там и там есть, то у обоих плюс или же в случае false - минусы у обоих
    как правильно написать, чтобы на выходе получать таблицу вида:


    массив 1 массив 2
    Подсветка + -
    Подогрев - +
    Линейка - -
    Термостат + +
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    По какому одному полю хочешь сравнивать?
     
  3. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    pole. У меня на сайте есть 2 селекта - одинаковых, в зависимости от выбранных параметров мне надо сформировать таблицу где в поле первого например есть данная опция, а во втором массиве нет, значит получается таблица вида. Не знаю как реализовать... Бьюсь, а толку, нужны знания более опытных

    массив 1 массив 2
    + -
    --- Добавлено ---
    Ну насколько я понимаю, надо сравнить ключи первого и второго массива, если они совпадают, то у обоих +, если первый не соответствует второму, то у первого +, а у второго -, если я правильно понимаю, но могу ошибаться.
     
  4. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Предлагаю упростить задачу до вида "Если это пойму, то и своё пойму".
    Убрать всю специфику с бамперами, подсветками и прочими решетками радиаторов.

    Чтобы было наглядно, что дано и что нужно сделать.
     
  5. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    Да что поменяется если я скину запрос в базу, вернет тот же самый массив объектов, который я уже представил. У меня вопрос именно в том, как сделать таблицу сравнения, если бы я знал как её написать со сравнением, я бы представил кусок кода, а так я совершенно не понимаю что написать, чтобы так получилось, поэтому приложить мне нечего.
    --- Добавлено ---
    как-то наверное надо 2 массива запихать в массив complectations предварительно сравнив

    PHP:
    1. if($_POST) {
    2.  
    3.   $complectations = []; //массив всех комплектаций
    4.  
    5.   $parametrOne = $_POST['ParamOne'];
    6.   $parametrTwo = $_POST['ParamTwo'];
    7.  
    8.   $modelOne = ComplectOption::model()->findAll('complectation_id=:complectation_id', [':complectation_id'=>$parametrOne]);
    9.   $modelTwo = ComplectOption::model()->findAll('complectation_id=:complectation_id', [':complectation_id'=>$parametrTwo]);
    10.  
    11.  
    12.  
    13.   $this->render('table', ['modelOne'=>$modelOne, 'modelTwo'=>$modelTwo]);
    14.  
    15.   }
    --- Добавлено ---
    Блин. неужели никто не делал этого?
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    ты сравниваешь pole у двух объектов, эти объекты имеют уникальный идентификатор?
    просто как ты уже сделал в третий массив по ключу уникального идентификатора pole пиши массив с двумя значениями pole и потом при выводи уже принимай решение, так как у тебя будет доступно два варианта и ты сможешь вывести + или - как хотел
     
  7. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    denis01, извини. не понимаю. По поводу уник. идентификаторов - да, каждый объект имеет уник. ид., 2 массива объектов, у каждого объекта уник. ид, но в целом, если эти два массива слить в один, они абсолютно одинаковы. Далее например, выбрал я в первом селекте complectation_id=180, а во втором complectation_id=185, 2 объекта из 2-х разных массивов объекта получили по разному
    complectation_id, далее идет проверка поле pole у первого объекта с полученным 180 и 185, если бы совпали, то у обоих +, а в данном случае у первого +, у второго - т.к. complectation_id разные. блин, извиняюсь если не верно излагаю мысль, сложно
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    как ты определяешь что 180 к 185 относится?
     
  9. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    denis01, ты задаешь вопрос человеку, который не знает как решить эту задачку, поэтому и взываю о помощи. Если ты знаешь как сделать верно, напиши плиз, а если не знаешь и мы пытаемся к чему-то придти, то так и скажи - давай думать вместе. Подумав, я понял, что надо думать в сторону расхождения массивов, это если не ошибаюсь функция array_diff. Ох((
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    так я просто узнаю условия задачи,
    могу предположить что в базе есть скажем запись с id 1
    потом есть в другой таблице ещё записи 180 и 185 и они связаны через запись с id 1
    и когда ты делаешь выборку 180 и 185 то там есть ещё и id 1 который их связывает или нет?
     
  11. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    denis01, нашел отличный пример того что нужно! Вот мне нужно один в один сделать! Вот ссылка http://renault-perm.ru/compl/new-logan
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    это всё картинки, надо знать если достаточно данных есть чтобы связать всё в таблицу
     
  13. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    на данный момент я имею 2 таблицы в базе, одна для селектов на сайте, другая для характеристик, записей не много, но есть. Когда на экшн приходит 2 параметра из селектов (complectation_id), делается 2 выборки характеристик, я в самом начале показал как они выглядят. Это 2 массива объектов. Теперь нужно сделать из этих 2-х выборок единый массив предварительно сравнив на расхождение. Еже ли выборка отдала id-шник характеристики равный например 1, и вторая выборка отдала равный 1, тогда в этот массив подгружается само название характеристики, а далее pole первого и pole второго. Дублировать pole не надо, нужно наверное через array_push добавить + в случае если равны и минус в случае если расхождение. Как то так. Блин, вроде не самая сложная задача которую решал, но мозгов выела(((
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    PHP:
    1. <?php
    2.  
    3. $one = [
    4.     '180' => [
    5.     'rel_id' => '1',
    6.     'pole' => false
    7.     ],
    8. ];
    9.  
    10. $two = [
    11.     '185' => [
    12.         'rel_id' => '1',
    13.         'pole' => true
    14.     ],
    15. ];
    16.  
    17. $comp = [];
    18.  
    19. foreach ($one as $key => $value) {
    20.     $comp[$value['rel_id']][$key]['pole'] = $value['pole'];
    21. }
    22.  
    23. foreach ($two as $key => $value) {
    24.     $comp[$value['rel_id']][$key]['pole'] = $value['pole'];
    25. }
    26.  
    27. var_export($comp);
     
    espltd нравится это.
  15. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    а как быть в случае с массивом объектов такого вида??

    Код (Text):
    1. Array
    2. (
    3.     [0] => ComplectOption Object
    4.         (
    5.             ['compl'] => Array
    6.                 (
    7.                     [complectation_id] => 189
    8.                     [title_group] => Дизайн
    9.                     [title_option] => Бамперы в цвет кузова
    10.                     [pole] => Б
    11.                 )
    12.         )
    13.  
    14.     [1] => ComplectOption Object
    15.         (
    16.             ['compl'] => Array
    17.                 (
    18.                     [complectation_id] => 189
    19.                     [title_group] => Дизайн
    20.                     [title_option] => Решетка радиатора черного цвета
    21.                     [pole] => -
    22.                 )
    23.         )
    24. )
     
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    что во втором объекте будет?
     
  17. espltd

    espltd Новичок

    С нами с:
    11 авг 2015
    Сообщения:
    47
    Симпатии:
    2
    Дак ведь все тоже самое. Как бы вы данную задачу реализовали исходя из ссылки что я вам кинул?
    --- Добавлено ---
    Ладно - не буду мучить, буду еще пробовать разные реализации которые придут в голову, но в любом случае спасибо за отзывчивость....
     
  18. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    тогда это хорошо, я даже код готовый дал, используй его
    --- Добавлено ---
    да
    --- Добавлено ---
    просто не понятно как связать надо, по id я дал код, думаю там понятно, его запускал, результат смотрел? в нём всё понятно?