Доброго всем дня! Помогите пожалуйста разобраться в сравнении 2-х массивов по опр. полю. Дело в том, что подобное никогда не делал, пытался сделать и циклом в цикле в цикле и одним циклом присваивая ключ первого массива итым для второго и таким образом пытался сравнивать. 3-ий день бьюсь, но ни как не могу понять как это сделать правильно. Цикл в цикле да под циклом как-то не самый лучший вариант. Хочется именно оптимизировано сделать - грамотно. Но озадачен этим впервые. Есть непонимание(( По возможности просьба помочь если кто сталкивался и знает. Есть у меня массив объектов вида: Код (Text): Array ( [0] => ComplectOption Object ( ['compl'] => Array ( [complectation_id] => 189 [title_group] => Дизайн [title_option] => Бамперы в цвет кузова [pole] => Б ) ) [1] => ComplectOption Object ( ['compl'] => Array ( [complectation_id] => 189 [title_group] => Дизайн [title_option] => Решетка радиатора черного цвета [pole] => - ) ) ) Интересует именно сравнение по одному полю. Т.е. в одном есть такая штука - ставим +, а в другом нет -, а если и там и там есть, то у обоих плюс или же в случае false - минусы у обоих как правильно написать, чтобы на выходе получать таблицу вида: массив 1 массив 2 Подсветка + - Подогрев - + Линейка - - Термостат + +
pole. У меня на сайте есть 2 селекта - одинаковых, в зависимости от выбранных параметров мне надо сформировать таблицу где в поле первого например есть данная опция, а во втором массиве нет, значит получается таблица вида. Не знаю как реализовать... Бьюсь, а толку, нужны знания более опытных массив 1 массив 2 + - --- Добавлено --- Ну насколько я понимаю, надо сравнить ключи первого и второго массива, если они совпадают, то у обоих +, если первый не соответствует второму, то у первого +, а у второго -, если я правильно понимаю, но могу ошибаться.
Предлагаю упростить задачу до вида "Если это пойму, то и своё пойму". Убрать всю специфику с бамперами, подсветками и прочими решетками радиаторов. Чтобы было наглядно, что дано и что нужно сделать.
Да что поменяется если я скину запрос в базу, вернет тот же самый массив объектов, который я уже представил. У меня вопрос именно в том, как сделать таблицу сравнения, если бы я знал как её написать со сравнением, я бы представил кусок кода, а так я совершенно не понимаю что написать, чтобы так получилось, поэтому приложить мне нечего. --- Добавлено --- как-то наверное надо 2 массива запихать в массив complectations предварительно сравнив PHP: if($_POST) { $complectations = []; //массив всех комплектаций $parametrOne = $_POST['ParamOne']; $parametrTwo = $_POST['ParamTwo']; $modelOne = ComplectOption::model()->findAll('complectation_id=:complectation_id', [':complectation_id'=>$parametrOne]); $modelTwo = ComplectOption::model()->findAll('complectation_id=:complectation_id', [':complectation_id'=>$parametrTwo]); $this->render('table', ['modelOne'=>$modelOne, 'modelTwo'=>$modelTwo]); } --- Добавлено --- Блин. неужели никто не делал этого?
ты сравниваешь pole у двух объектов, эти объекты имеют уникальный идентификатор? просто как ты уже сделал в третий массив по ключу уникального идентификатора pole пиши массив с двумя значениями pole и потом при выводи уже принимай решение, так как у тебя будет доступно два варианта и ты сможешь вывести + или - как хотел
denis01, извини. не понимаю. По поводу уник. идентификаторов - да, каждый объект имеет уник. ид., 2 массива объектов, у каждого объекта уник. ид, но в целом, если эти два массива слить в один, они абсолютно одинаковы. Далее например, выбрал я в первом селекте complectation_id=180, а во втором complectation_id=185, 2 объекта из 2-х разных массивов объекта получили по разному complectation_id, далее идет проверка поле pole у первого объекта с полученным 180 и 185, если бы совпали, то у обоих +, а в данном случае у первого +, у второго - т.к. complectation_id разные. блин, извиняюсь если не верно излагаю мысль, сложно
denis01, ты задаешь вопрос человеку, который не знает как решить эту задачку, поэтому и взываю о помощи. Если ты знаешь как сделать верно, напиши плиз, а если не знаешь и мы пытаемся к чему-то придти, то так и скажи - давай думать вместе. Подумав, я понял, что надо думать в сторону расхождения массивов, это если не ошибаюсь функция array_diff. Ох((
так я просто узнаю условия задачи, могу предположить что в базе есть скажем запись с id 1 потом есть в другой таблице ещё записи 180 и 185 и они связаны через запись с id 1 и когда ты делаешь выборку 180 и 185 то там есть ещё и id 1 который их связывает или нет?
denis01, нашел отличный пример того что нужно! Вот мне нужно один в один сделать! Вот ссылка http://renault-perm.ru/compl/new-logan
на данный момент я имею 2 таблицы в базе, одна для селектов на сайте, другая для характеристик, записей не много, но есть. Когда на экшн приходит 2 параметра из селектов (complectation_id), делается 2 выборки характеристик, я в самом начале показал как они выглядят. Это 2 массива объектов. Теперь нужно сделать из этих 2-х выборок единый массив предварительно сравнив на расхождение. Еже ли выборка отдала id-шник характеристики равный например 1, и вторая выборка отдала равный 1, тогда в этот массив подгружается само название характеристики, а далее pole первого и pole второго. Дублировать pole не надо, нужно наверное через array_push добавить + в случае если равны и минус в случае если расхождение. Как то так. Блин, вроде не самая сложная задача которую решал, но мозгов выела(((
PHP: <?php $one = [ '180' => [ 'rel_id' => '1', 'pole' => false ], ]; $two = [ '185' => [ 'rel_id' => '1', 'pole' => true ], ]; $comp = []; foreach ($one as $key => $value) { $comp[$value['rel_id']][$key]['pole'] = $value['pole']; } foreach ($two as $key => $value) { $comp[$value['rel_id']][$key]['pole'] = $value['pole']; } var_export($comp);
а как быть в случае с массивом объектов такого вида?? Код (Text): Array ( [0] => ComplectOption Object ( ['compl'] => Array ( [complectation_id] => 189 [title_group] => Дизайн [title_option] => Бамперы в цвет кузова [pole] => Б ) ) [1] => ComplectOption Object ( ['compl'] => Array ( [complectation_id] => 189 [title_group] => Дизайн [title_option] => Решетка радиатора черного цвета [pole] => - ) ) )
Дак ведь все тоже самое. Как бы вы данную задачу реализовали исходя из ссылки что я вам кинул? --- Добавлено --- Ладно - не буду мучить, буду еще пробовать разные реализации которые придут в голову, но в любом случае спасибо за отзывчивость....
тогда это хорошо, я даже код готовый дал, используй его --- Добавлено --- да --- Добавлено --- просто не понятно как связать надо, по id я дал код, думаю там понятно, его запускал, результат смотрел? в нём всё понятно?