Добрый день. Есть такой массив PHP: $array = [ ['test' => 'test1','id' => '1'], ['test' => 'test2','id' => '3'], ['test' => 'test2','id' => '4'], ['test' => 'test2','id' => '5'], ]; Подскажите как из него получить массив такого вида: PHP: $array = [ ['test' => 'test1','id' => '1'], ['test' => 'test2','id' => '3, 4, 5'], ]; То есть объединить Id в строку через запятую, если test одинаковый.
намутил так: PHP: $array = [ ['test' => 'test1','id' => '1'], ['test' => 'test2','id' => '3'], ['test' => 'test2','id' => '4'], ['test' => 'test2','id' => '5'], ]; $a = []; $result = []; $select = ''; foreach($array as $item){ $search = array_search($item['test'], $a); if($search === false){ $a[] = $item['test']; $r = array_keys(array_column($array, 'test'), $item['test']); foreach($r as $key => $s){ if($key === 0){ $id = $array[$s]['id']; }else{ $id .= ', '.$array[$s]['id']; } } $result[] = [ 'test' => $item['test'], 'id' => $id ]; } } print_r($result); //Array ( [0] => Array ( [test] => test1 [id] => 1 ) [1] => Array ( [test] => test2 [id] => 3, 4, 5 ) )Array ( [0] => Array ( [test] => test1 [id] => 1 ) [1] => Array ( [test] => test2 [id] => 3, 4, 5 ) )
В начале темы, второй массив - в квантовом, распределительном мире, состояние значения не правильная. PHP: $array = [ ['test' => 'test1','id' => [ 1 ] ], ['test' => 'test2','id' => [ 3, 4, 5 ] ], ];
@MouseZver там id именно строка нужна была, через запятую. И у меня в ответе 3 дубля получилось, мелкая ошибка там. Позже напишу тут правильно.
@twim32 нет, там вывод был в html. Примерно такой: PHP: <?php $array = [ ['test' => 'test1','id' => '1'], ['test' => 'test2','id' => '3'], ['test' => 'test2','id' => '4'], ['test' => 'test2','id' => '5'], ]; $a = []; $options = ''; foreach($array as $item){ $search = array_search($item['test'], $a); if($search === false){ $a[] = $item['test']; $r = array_keys(array_column($array, 'test'), $item['test']); foreach($r as $key => $s){ if($key === 0){ $id = $array[$s]['id']; }else{ $id .= ', '.$array[$s]['id']; } } $options .= '<option value="'.$item['test'].'">'.$id.'</option>'; } } ?> <select><?=$options?></select> результат: HTML: <select> <option value="test1">1</option> <option value="test2">3, 4, 5</option> </select> --- Добавлено --- @MouseZver я вообще к чему это расписываю, неужели мой велосипед нормальный, и нет того же самого через array_map + include?
@Valick уу, расскажу только что поле json в таблице хранит много таин =) и да, не я такую таблицу создавал, меня не ругать =)
Я догадываюсь почему @Valick спросил: потому что описанное преобразование очень похоже на результат группировки в MySQL c применением функции GROUP_CONCAT() Если что-то можно сделать на стороне БД, а не PHP, то лучше в БД.
@artoodetoo не получится к сожалению, это не результат запроса, а php обработка поля json из бд. Если бы оно хранилось нормально, то да.
@Artur_hopf, и поле json небось хранится как текст, а не как json? @artoodetoo, ну для нормального ответа всегда надо знать откуда массив и как он формируется, тут и к бабке не ходи
@Valick да, в лучших традициях, потому что в этом столбце так же может хранится и все остальное, текст например =)
Нет, задачу я закрыл уже ночью. Доступа к бд нет теперь. Просто было интересно как по другому можно. --- Добавлено --- но создавался этот массив так в цикле: PHP: $meta = json_decode($item->meta, true); $i = array_search($id, array_column($meta, 'id')); if($i !== false){ $array[] = [ 'test' => $item->name, 'id' => $item->id ]; } то есть нужно было проверить есть ли в этом json такой id, и если да то записываем в массив. А потом уже эти id превращаем в строки и оставляем только уникальные name я хз, может ли так mysql. Может и да, я не опытен. И да $item->id лежит в другой таблице, там joinами все соединяется.
С этого и надо было начинать, опять за деревьями леса не видно PHP: $array[$v[$item->name]][] = $item->id; PHP: $str = ''; foreach($array as $k => $v){ $str .= '<option value="'.$k.'">'.implode(', ',$v).'</option>'; }