За последние 24 часа нас посетили 18389 программистов и 1601 робот. Сейчас ищут 1217 программистов ...

Подскажите как объединить массив?

Тема в разделе "PHP для новичков", создана пользователем Artur_hopf, 27 июн 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день. Есть такой массив
    PHP:
    1. $array = [
    2.   ['test' => 'test1','id' => '1'],
    3.   ['test' => 'test2','id' => '3'],
    4.   ['test' => 'test2','id' => '4'],
    5.   ['test' => 'test2','id' => '5'],
    6. ];
    Подскажите как из него получить массив такого вида:
    PHP:
    1. $array = [
    2.   ['test' => 'test1','id' => '1'],
    3.   ['test' => 'test2','id' => '3, 4, 5'],
    4. ];
    То есть объединить Id в строку через запятую, если test одинаковый.
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    намутил так:
    PHP:
    1. $array = [
    2.   ['test' => 'test1','id' => '1'],
    3.   ['test' => 'test2','id' => '3'],
    4.   ['test' => 'test2','id' => '4'],
    5.   ['test' => 'test2','id' => '5'],
    6. ];
    7.  
    8. $a = [];
    9. $result = [];
    10. $select = '';
    11. foreach($array as $item){
    12.   $search = array_search($item['test'], $a);
    13.   if($search === false){
    14.     $a[] = $item['test'];
    15.     $r = array_keys(array_column($array, 'test'), $item['test']);
    16.     foreach($r as $key => $s){
    17.         if($key === 0){
    18.           $id = $array[$s]['id'];
    19.         }else{
    20.           $id .= ', '.$array[$s]['id'];
    21.         }
    22.     }
    23.  
    24.     $result[] = [
    25.         'test' => $item['test'],
    26.         'id' => $id
    27.     ];
    28.  
    29.   }
    30. }
    31.  
    32. 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 ) )
     
    TeslaFeo нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
    В начале темы, второй массив - в квантовом, распределительном мире, состояние значения не правильная.

    PHP:
    1. $array = [
    2.   ['test' => 'test1','id' => [ 1 ] ],
    3.   ['test' => 'test2','id' => [ 3, 4, 5 ] ],
    4. ];
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @MouseZver там id именно строка нужна была, через запятую. И у меня в ответе 3 дубля получилось, мелкая ошибка там. Позже напишу тут правильно.
     
  5. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    1. Для массивов лучше использовать json
    2.
    Код (Text):
    1. print_r( array_merge($array, $array2) );
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @twim32 нет, там вывод был в html. Примерно такой:

    PHP:
    1. <?php
    2. $array = [
    3. ['test' => 'test1','id' => '1'],
    4. ['test' => 'test2','id' => '3'],
    5. ['test' => 'test2','id' => '4'],
    6. ['test' => 'test2','id' => '5'],
    7. ];
    8.  
    9. $a = [];
    10. $options = '';
    11. foreach($array as $item){
    12.     $search = array_search($item['test'], $a);
    13.     if($search === false){
    14.          $a[] = $item['test'];
    15.          $r = array_keys(array_column($array, 'test'), $item['test']);
    16.          foreach($r as $key => $s){
    17.               if($key === 0){
    18.                    $id = $array[$s]['id'];
    19.               }else{
    20.                    $id .= ', '.$array[$s]['id'];
    21.               }
    22.          }
    23.  
    24.          $options .= '<option value="'.$item['test'].'">'.$id.'</option>';
    25.  
    26.        }
    27. }
    28. ?>
    29. <select><?=$options?></select>
    результат:
    HTML:
    1.    <option value="test1">1</option>
    2.    <option value="test2">3, 4, 5</option>
    3.  
    --- Добавлено ---
    @MouseZver я вообще к чему это расписываю, неужели мой велосипед нормальный, и нет того же самого через array_map + include?
     
  7. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, откуда исходный массив?
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Valick уу, расскажу только что поле json в таблице хранит много таин =)
    и да, не я такую таблицу создавал, меня не ругать =)
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.103
    Симпатии:
    1.243
    Адрес:
    там-сям
    Я догадываюсь почему @Valick спросил: потому что описанное преобразование очень похоже на результат группировки в MySQL c применением функции GROUP_CONCAT() :)

    Если что-то можно сделать на стороне БД, а не PHP, то лучше в БД.
     
  10. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @artoodetoo не получится к сожалению, это не результат запроса, а php обработка поля json из бд. Если бы оно хранилось нормально, то да.
     
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, и поле json небось хранится как текст, а не как json?
    @artoodetoo, ну для нормального ответа всегда надо знать откуда массив и как он формируется, тут и к бабке не ходи :)
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Valick да, в лучших традициях, потому что в этом столбце так же может хранится и все остальное, текст например =)
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, коперфилдни сюда для примера хотя бы одно значение этого "json" поля на всякий случай.
     
  14. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Нет, задачу я закрыл уже ночью. Доступа к бд нет теперь. Просто было интересно как по другому можно.
    --- Добавлено ---
    но создавался этот массив так в цикле:
    PHP:
    1. $meta = json_decode($item->meta, true);
    2. $i = array_search($id, array_column($meta, 'id'));
    3. if($i !== false){
    4.     $array[] = [
    5.       'test' => $item->name,
    6.        'id' => $item->id
    7.    ];
    8. }
    то есть нужно было проверить есть ли в этом json такой id, и если да то записываем в массив. А потом уже эти id превращаем в строки и оставляем только уникальные name
    я хз, может ли так mysql. Может и да, я не опытен. И да $item->id лежит в другой таблице, там joinами все соединяется.
     
    #14 Artur_hopf, 28 июн 2019
    Последнее редактирование: 28 июн 2019
  15. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    С этого и надо было начинать, опять за деревьями леса не видно :)
    PHP:
    1. $array[$v[$item->name]][] = $item->id;
    PHP:
    1. $str = '';
    2. foreach($array as $k => $v){
    3.     $str .= '<option value="'.$k.'">'.implode(', ',$v).'</option>';
    4. }
     
    Valick и Artur_hopf нравится это.