Я хочу сопоставить свой ответ JSON с конкретной конструкцией массива.
Вот мои данные JSON вкратце:
"code": 200,
"unit": null,
"data": [
{
"2022-11-16": 185.6159202
},
{
"2022-11-17": 204.31997631
},...
]
Мне нужна помощь, чтобы сопоставить эти данные, чтобы иметь структуру массива, как показано ниже:
Array (
[0] => Array(
[date] => 2018-01-03
[value] => 0.0002444
)
[1] => Array(
[date] => 2018-01-04
[value] => 0.0171476
)
)
Мой код в PHP:
$decoded = json_decode($json, true);
$arr = $decoded['data'];
После этого структура массива выглядит так, что не совсем то, что я ожидаю:
Array (
[0] => Array ( [2018-01-03] => 0.0002444 )
[1] => Array ( [2018-01-04] => 0.0171476 )
)
Использование array_keys() и array_values() не является идеальным/оптимальным подходом, потому что это создает ненужную глубину при доступе к данным. Видите, как нужно писать [0] после каждого звонка? Не рекомендуется создавать временный массив, если вы собираетесь получить доступ только к первому элементу из него. Просто используйте key() и current() (или reset()).
Программирование в функциональном стиле с array_map(): (Демо)
var_export(
array_map(
fn($item) => ['date' => key($item), 'value' => current($item)],
json_decode($json, true)['data']
)
);
Классический foreach(): (Демо)
$result = [];
foreach (json_decode($json, true)['data'] as $item) {
$result[] = ['date' => key($item), 'value' => current($item)];
}
var_export($result);
Или с меньшим количеством повторных вызовов функций: (Demo)
$result = [];
foreach (json_decode($json, true)['data'] as $item) {
$key = key($item);
$result[] = ['date' => $key, 'value' => $item[$key]];
}
var_export($result);
Или с compact(): (Демо)
$result = [];
foreach (json_decode($json, true)['data'] as $item) {
foreach ($item as $date => $value) {
$result[] = compact(['date', 'value']);
}
}
var_export($result);