Объединить несколько столбцов в массив как один из ключей в наборе результатов

#php #arrays #json

#php #массивы #json

Вопрос:

У меня возникли проблемы с размещением данных в правильной структуре. У меня есть данные результирующего набора из:

 array (
  0 => 
  array (
    'company_id' => 1,
    'company_abbrev' => 'amd',
    'description' => 'amd blah blah blah 1',
  ),
  1 => 
  array (
    'company_id' => 1,
    'company_abbrev' => 'amd',
    'description' => 'amd blah blah blah 2',
  ),
  2 => 
  array (
    'company_id' => 2,
    'company_abbrev' => 'int',
    'description' => 'int blah blah 1',
  ),
  3 => 
  array (
    'company_id' => 2,
    'company_abbrev' => 'int',
    'description' => 'int blah blah 2',
  ),
  

Я пытаюсь объединить описание в отдельный массив внутри каждой компании в единственную уникальную запись:

 array (
  'amd' => 
  array (
    'company_id' => 1,
    'job_description' => 
    array (
      0 => 'amd blah blah 1',
      1 => 'amd blah blah 2',
    ),
  ),
  

Цикл, в котором я участвую, объединяет все описания должностей в каждой из разных компаний по мере того, как он доходит до самой последней компании. Что я делаю не так?

 for($i = 0; $i < sizeof($comp); $i  ) {
            $companies[$comp[$i]['company_abbrev']] = $comp[$i];
            $array[] = $comp[$i]['description'];
            $companies[$comp[$i]['company_abbrev']]['job_description'] = $array;
}
  

Комментарии:

1. вы пытаетесь сгруппировать элементы с тем же идентификатором компании, что и один

2. @FestusYuma Я хочу сделать его уникальным для каждой компании, будь то идентификатор компании или аббревиатура компании.

Ответ №1:

 foreach($comp as $com) {
    if(!isset($companies[$com['company_abbrev']])) {
        $companies[$com['company_abbrev']] = array();
        $companies[$com['company_abbrev']]['company_id'] = $com['company_id'];
    }

    $companies[$com['company_abbrev']]['description'][] = $com['description'];
}
  

этот цикл группирует его, используя аббревиатуру компании

Ответ №2:

Вы можете просмотреть массив следующим образом,

 $res = [];
array_walk($arr, function (amp;$val, $key) use (amp;$res) {
    $res[$val['company_abbrev']]['company_id']        = $val['company_id']; // setting company id
    $res[$val['company_abbrev']]['job_description'][] = $val['description']; // AUTOMATIC mapping
});
print_r($res);
  

(Вывод)

 Array
(
    [amd] => Array
        (
            [company_id] => 1
            [job_description] => Array
                (
                    [0] => amd blah blah blah 1
                    [1] => amd blah blah blah 2
                )

        )

    [int] => Array
        (
            [company_id] => 2
            [job_description] => Array
                (
                    [0] => int blah blah 1
                    [1] => int blah blah 2
                )

        )

)
  

(Демо).

Ответ №3:

Нет необходимости проверять, объявлены ли подмассивы (или объявлять их как пустой массив), прежде чем вводить в них данные.

Используйте extract() для создания простых переменных вместо того, чтобы загонять скрипт в квадратные скобки.

Я добавил s в конец job_description , потому что множественное число лучше представляет данные.

При использовании extract() будьте осторожны, чтобы ключи, преобразуемые в переменные, не мешали другой ранее объявленной переменной в той же области видимости.

Код: (демо)

 $result = [];
foreach ($array as $row) {
    extract($row);
    $result[$company_abbrev]['company_id'] = $company_id;
    $result[$company_abbrev]['job_descriptions'][] = $description;
}
var_export($result);