Обработка многомерного массива. С созданием множества массивов
Сейчас у меня есть не полная версия обработки массива. Изначальный массив:
"datasetTransactionsOrders": [
{
"seriesname": "Автоклуб",
"value": "2"
},
{
"seriesname": "Скидка 10%",
"value": "1"
},
{
"seriesname": "Скидка 10%",
"value": "17"
}
]
Мне нужно преобразовать его следующим образом.
"datasetTransactionsOrders": [
{
"seriesname": "Автоклуб",
"data": [
{
value: "2"
}
]
},
{
"seriesname": "Скидка 10%",
"data": [
{
value: "1"
},
{
value: "17"
}
]
}
]
Т.е сформировать для элементов многомерного массива, у которых повторяется seriesname массивы заданных значений. Сейчас у меня есть кусок кода, который складывает данные значения
$data = [];
for($i = 0, $size = count($datasetTransactionsOrders); $i < $size; ++$i){
if (array_key_exists($datasetTransactionsOrders[$i]['seriesname'], $data)) {
$data[$datasetTransactionsOrders[$i]['seriesname']] += $datasetTransactionsOrders[$i]['value'];
}
else {
$data[$datasetTransactionsOrders[$i]['seriesname']] = $datasetTransactionsOrders[$i]['value'];
}
}
$result = [];
foreach ($data as $seriesname => $value) {
array_push($result, [
'seriesname' => $seriesname,
'data' => $value,
]);
}
return array ('datasetTransactionsOrders'=>$result);
Результат следующий
"datasetTransactionsOrders": [
{
"seriesname": "Автоклуб",
"data": "2"
},
{
"seriesname": "Скидка 10%",
"data": 18
}
]
Ответы (2 шт):
Автор решения: teran
→ Ссылка
возьмите уникальные значения series_name
$sn = array_unique(array_column($data, 'seriesname'));
Создайте массив, такой чтобы эти значения стали ключами, сделав заготовку для data
$result = array_fill_keys($sn, ['data' => []]);
Теперь проходите по массиву и раскладывайте значения, куда надо.
foreach($data as $d){
$r = &$result[ $d['seriesname'] ];
$r['seriesname'] = $d['seriesname'];
$r['data'][] = [ 'value' => $d['value'] ];
}
потом ключи скините с помощью array_values()
Автор решения: wnull
→ Ссылка
Ну.. или прямо через foreach:
$new = [];
foreach ($array['datasetTransactionsOrders'] as $key => &$value)
{
$new[$value['seriesname']]['seriesname'] = $value['seriesname'];
$new[$value['seriesname']]['data'][$key]['value'] = $value['value'];
}
$new = array_values($new);
print_r($new);