Доброго времени суток. Ребята, помогите с проблемой пожалуйста. Есть три массива (получаю данные из БД) Код (Text): // МАССИВ 1 - ГРУППЫ Array ( [0] => Array ( [group_id] => 1 [group_title] => Группа 1 ) [1] => Array ( [group_id] => 2 [group_title] => Группа 2 ) ) // МАССИВ 2 - ПАРАМЕТРЫ Array ( [0] => Array ( [group] => 0 [title] => Параметр 1 [value] => 1 ) [1] => Array ( [group] => 2 [title] => Параметр 2 [value] => 4 ) [2] => Array ( [group] => 0 [title] => Параметр 3 [value] => 6 ) ) // МАССИВ 3 - ЗНАЧЕНИЯ Array ( [0] => Array ( [value_id] => 1 [value_title] => Значение 1 ) [1] => Array ( [value_id] => 4 [value_title] => Значение 2 ) [2] => Array ( [value_id] => 6 [value_title] => Значение 1 ) ) На выходе нужно получить Код (Text): Array ( [0] => Array ( [group_id] => 1 [group_title] => Группа 1 ) [1] => Array ( [group_id] => 2 [group_title] => Группа 2 [features] => Array ( [0] => Array ( [group] => 2 [title] => Параметр 2 [value] => 4 [values] => Array ( [0] => Array ( [value_id] => 4 [value_title] => Значение 4 ) [1] => Array ( [value_id] => 4 [value_title] => Значение 5 ) ) ) ) ) [] => Array ( [group_id] => [group_title] => [features] => Array ( [0] => Array ( [group] => 0 [title] => Параметр 1 [value] => 1 [values] => Array ( [0] => Array ( [value_id] => 1 [value_title] => Значение 1 ) ) ) [1] => Array ( [group] => 0 [title] => Параметр 3 [value] => 6 [values] => Array ( [0] => Array ( [value_id] => 6 [value_title] => Значение 6 ) ) ) ) ) ) Связь групп и параметров по group_id и group Связь параметров и значений по value и value_id Но бывает так, что группа не указана а в массив все равно нужно выводить параметры. Т.е. тут получается так, что часть параметров может быть привязана к группам, а часть нет. Гуглил много, форычей перенаписал кучу, но не получается сделать такой массив.
Вот в коде собрал Код (Text): // МАССИВ 1 - ГРУППЫ $arr1 = array( array( 'group_id' => '1', 'group_title' => 'Группа 1', ), array( 'group_id' => '2', 'group_title' => 'Группа 2', ), ); // МАССИВ 2 - ПАРАМЕТРЫ $arr2 = array( array( 'group' => '0', 'title' => 'Параметр 1', 'value' => '1', ), array( 'group' => '2', 'title' => 'Параметр 2', 'value' => '4', ), array( 'group' => '0', 'title' => 'Параметр 3', 'value' => '6', ), ); // МАССИВ 3 - ЗНАЧЕНИЯ $arr3 = array( array( 'value_id' => '1', 'value_title' => 'Значение 1', ), array( 'value_id' => '4', 'value_title' => 'Значение 2', ), array( 'value_id' => '6', 'value_title' => 'Значение 1', ), );
Это простая логика Код (PHP): function mix($arr1, $arr2, $arr3) { foreach ($arr1 as &$group) { foreach ($arr2 as $n=>&$param) { foreach ($arr3 as $u=>$value) { if ($value['value_id'] == $param['value']) { if (empty($param['values'])) { $param['values'] = array($value); } else { $param['values'][] = $value; } unset($arr3[$u]); } } if ($param['group'] == $group['group_id']) { if (empty($group['features'])) { $group['features'] = array($param); } else { $group['features'][] = $param; } unset($arr2[$n]); } } } return $arr1; } Правда она не решает задачу с отсутствующими группами
Спасибо большое! Буду пробовать что-то сделать с группами. Правда пока без понятия что)) Это же получается что нужно пустой массив как-то создавать?
Что-то не пойму как сливать значения к определенным параметрам. Массив немного изменен, к Параметр 3 добавилось еще одно Значение 7 Добавился ID параметра Пример Код (Text): // МАССИВ 1 - ГРУППЫ $arr1 = array( array( 'group_id' => '1', 'group_title' => 'Группа 1', ), array( 'group_id' => '2', 'group_title' => 'Группа 2', ), ); // МАССИВ 2 - ПАРАМЕТРЫ $arr2 = array( array( 'group' => '1', 'pid' => '1', 'title' => 'Параметр 1', 'value' => '1', ), array( 'group' => '2', 'pid' => '2', 'title' => 'Параметр 2', 'value' => '4', ), array( 'group' => '2', 'pid' => '3', 'title' => 'Параметр 3', 'value' => '6', ), array( 'group' => '2', 'pid' => '3', 'title' => 'Параметр 3', 'value' => '7', ), ); // МАССИВ 3 - ЗНАЧЕНИЯ $arr3 = array( array( 'value_id' => '1', 'value_title' => 'Значение 1', ), array( 'value_id' => '4', 'value_title' => 'Значение 2', ), array( 'value_id' => '6', 'value_title' => 'Значение 1', ), array( 'value_id' => '7', 'value_title' => 'Значение 7', ), ); Но не получается слить параметры по pid, чтобы они не повторялись в массиве. Т.е. у нас Параметр 3 в массиве два раза, так как у него два значения. Но как сделать, чтобы объединить Параметр 3 по pid, и в нем уже вывести его значения 6 и 7 Параметр 3 --- Значение 6 --- Значение 7 а не Параметр 3 --- Значение 6 Параметр 3 --- Значение 7
пройти в цикле по массиву и переделать в новый массив foreach ($arr2 as $arr2_val) { $newarray[$arr2_val['pid']][] = $arr2_val; }
Извиняюсь за нубство, но можно подробнее? если вместо arr2 в функцию mix отдаю новый массив newarray, то выводит только группы, так как массив изменился и функция уже не работает.
Не вижу как можно array_merge использовать. нужно просто если pid совпадает, то объединять значения этого pid в один массив.
Ребята, ну помогите пожалуйста. Не могу поправить функцию предложенную [vs], чтобы заработало с новым массивом, как предложил igordata
Код (PHP): // МАССИВ 1 - ГРУППЫ $arr1 = array( array( 'group_id' => '1', 'group_title' => 'Группа 1', ), array( 'group_id' => '2', 'group_title' => 'Группа 2', ), ); // МАССИВ 2 - ПАРАМЕТРЫ $arr2 = array( array( 'group' => '0', 'title' => 'Параметр 1', 'value' => '1', ), array( 'group' => '2', 'title' => 'Параметр 2', 'value' => '4', ), array( 'group' => '0', 'title' => 'Параметр 3', 'value' => '6', ), ); // МАССИВ 3 - ЗНАЧЕНИЯ $arr3 = array( array( 'value_id' => '1', 'value_title' => 'Значение 1', ), array( 'value_id' => '4', 'value_title' => 'Значение 2', ), array( 'value_id' => '6', 'value_title' => 'Значение 1', ), ); //причешем первый массив $a = array(); foreach ($arr1 as $value) { $a[$value['group_id']] = $value['group_title']; } $arr1 = $a; unset($a); //теперь третий $a = array(); foreach ($arr3 as $value) { $a[$value['value_id']] = $value['value_title']; } $arr3 = $a; unset($a); //можно клеить $mix = array(); foreach ($arr2 as $a2) { //var_dump($a2); $mix[$a2['group']] = array( 'group' => $a2['group'], 'group_title' => (isset($arr1[$a2['group']]) ? $arr1[$a2['group']] : $a2['group'] ), 'title' => (isset($arr3[$a2['title']]) ? $arr3[$a2['title']] : $a2['title']), ); } var_dump($mix);
igordata, $mix не возвращает "Параметр 1" только Код (Text): Array ( [0] => Array ( [group] => 0 [group_title] => 0 [title] => Параметр 3 ) [2] => Array ( [group] => 2 [group_title] => Группа 2 [title] => Параметр 2 ) ) что-то я запутался совсем.
что? Добавлено спустя 17 секунд: а, точно Добавлено спустя 9 минут 29 секунд: Код (PHP): <?php // МАССИВ 1 - ГРУППЫ $arr1 = array( array( 'group_id' => '1', 'group_title' => 'Группа 1', ), array( 'group_id' => '2', 'group_title' => 'Группа 2', ), ); // МАССИВ 2 - ПАРАМЕТРЫ $arr2 = array( array( 'group' => '0', 'title' => 'Параметр 1', 'value' => '1', ), array( 'group' => '2', 'title' => 'Параметр 2', 'value' => '4', ), array( 'group' => '0', 'title' => 'Параметр 3', 'value' => '6', ), ); // МАССИВ 3 - ЗНАЧЕНИЯ $arr3 = array( array( 'value_id' => '1', 'value_title' => 'Значение 1', ), array( 'value_id' => '4', 'value_title' => 'Значение 2', ), array( 'value_id' => '6', 'value_title' => 'Значение 1', ), ); //причешем первый массив $a = array(); foreach ($arr1 as $value) { $a[$value['group_id']] = $value['group_title']; } $arr1 = $a; unset($a); //теперь второй //$a = array(); //foreach ($arr2 as $value) { // $a[$value['group']] = $value; //} //$arr2 = $a; //unset($a); //теперь третий $a = array(); foreach ($arr3 as $value) { $a[$value['value_id']] = $value['value_title']; } $arr3 = $a; unset($a); //можно клеить $mix = array(); foreach ($arr2 as $a2) { //var_dump($a2); if (!isset($mix[$a2['group']])) { $mix[$a2['group']] = array( 'group' => $a2['group'], 'group_title' => (isset($arr1[$a2['group']]) ? $arr1[$a2['group']] : $a2['group'] ), 'params' => array(), ); } $mix[$a2['group']]['params'][$a2['title']] = (isset($arr3[$a2['value']]) ? $arr3[$a2['value']] : null); } var_dump($mix);
Спасибо большое. Еще у $mix[$a2['group']]['params'][$a2['title']] нужно добавить [] иначе у параметра всегда будет только одно значение. сложны для меня все это манипуляции с массивами. никак не могу въехать в них нормально :|
Скорее всего намудрил) суть такая Группы не обязательны и делаю только некую категоризацию параметров, если те однотипные. Т.е. параметры схожие по сути своей. но как заметил [vs], то проще создать "специальные" группы и сними особо работать. так же Значения могут быть не привязаны к параметрам(не учел этого кстати в массиве, попробую как-то сам доделать). Т.е. значение может быть одиночным и не состоять в каком либо параметре и группе. Возможно я сильно тут загибаю с настройками этого всего...
Изначально были значения Потом пришлось из-за их количества объединить в параметры. Далее, некоторые параметры уже повязать в группы. А некоторые параметры и значения остались без связей, так как их не мало. Раскидывать их по каким-то группам и параметрам не подходит. Добавлено спустя 34 минуты 56 секунд: Хм. А можно как-то все значения массивов получить в конечном массиве? Из БД вытягиваю много разных данных. В реале массивы содержать не только ID и названия, но и кучи других данных. Сейчас жестко только ID и названия. Там группы содержат статусы, параметры ряд других необходимых данных.
Изменил немного Код (Text): // МАССИВ 1 - ГРУППЫ $arr1 = array( array( 'group_id' => '1', 'group_title' => 'Группа 1', 'group_desc' => 'Описание группы 1', 'group_img' => 'img1.gif', ), array( 'group_id' => '2', 'group_title' => 'Группа 2', 'group_desc' => 'Описание группы 2', 'group_img' => 'img2.gif', ), ); // МАССИВ 2 - ПАРАМЕТРЫ $arr2 = array( array( 'group' => '0', 'title' => 'Параметр 1', 'value' => '1', ), array( 'group' => '2', 'title' => 'Параметр 2', 'value' => '4', ), array( 'group' => '2', 'title' => 'Параметр 3', 'value' => '6', ), array( 'group' => '1', 'title' => 'Параметр 3', 'value' => '7', ), array( 'group' => '1', 'title' => 'Параметр 2', 'value' => '8', ), ); // МАССИВ 3 - ЗНАЧЕНИЯ $arr3 = array( array( 'value_id' => '1', 'value_title' => 'Значение 1', ), array( 'value_id' => '4', 'value_title' => 'Значение 2', ), array( 'value_id' => '6', 'value_title' => 'Значение 6', ), array( 'value_id' => '7', 'value_title' => 'Значение 7', ), array( 'value_id' => '8', 'value_title' => 'Значение 8', ), ); //arr1 $a = array(); foreach ($arr1 as $value) { $a[$value['group_id']] = $value; } $arr1 = $a; unset($a); //arr3 $a = array(); foreach ($arr3 as $value) { $a[$value['value_id']] = $value; } $arr3 = $a; unset($a); //собираем $mix = array(); foreach ($arr2 as $a2) { if (!isset($mix[$a2['group']])) { $mix[$a2['group']] = (isset($arr1[$a2['group']]) ? $arr1[$a2['group']] : null); } $mix[$a2['group']]['params'][$a2['title']][] = (isset($arr3[$a2['value']]) ? $arr3[$a2['value']] : null); } print_r($mix); Сейчас в результате даёт массив Код (Text): [1] => Array ( [group_id] => 1 [group_title] => Группа 1 [group_desc] => Описание группы 1 [group_img] => img1.gif [params] => Array ( [Параметр 3] => Array ( [0] => Array ( [value_id] => 7 [value_title] => Значение 7 ) ) [Параметр 2] => Array ( [0] => Array ( [value_id] => 8 [value_title] => Значение 8 ) ) ) ) А хотелось более удобный, типа Код (Text): [1] => Array ( [group_id] => 1 [group_title] => Группа 1 [group_desc] => Описание группы 1 [group_img] => img1.gif [params] => Array ( [0] => Array ( [group] => 1 [title] => Параметр 3 [values] => Array ( [0] => Array ( [value_id] => 7 [value_title] => Значение 7 ) [0] => Array ( [value_id] => 1 [value_title] => Значение 1 ) ) ) [1] => Array ( [group] => 1 [title] => Параметр 2 [values] => Array ( [0] => Array ( [value_id] => 8 [value_title] => Значение 8 ) ) ) ) ) Т.е. чтобы массив params содержал в себе данные параметра и массив values со всеми его значениями. и сохранить сортировку из базы.
А как-то можно отсортировать все в конечном массиве по тому, как отсортировано в БД? у меня все имеет сортировку, и группы и параметры и значения. Как понял, то тут поможет что-то типа uasort? но не понял как с этой функцией работать.