#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);