PHP: Как переименовать все ключи вложенного списка (массива) в «элементы»

Мне нужно «переформатировать» некоторые данные, поступающие из внешнего API, чтобы он работал с модулем вложенного списка Sencha touch. Я не могу изменить вывод данных этого внешнего API. Вот пример данных, которые я получаю из API:

$quest = array(
'gastronomy' => [
'restaurants' => [
'italians' => [
[
'title' => 'Al Castello',
'leaf' => true
],

[
'title' => 'Italia',
'leaf' => true
]
],

'asians' => [
[
'title' => 'Gautam',
'leaf' => true
],

[
'title' => 'Wok',
'leaf' => true
]
]
]
]
);

Чтобы заставить его работать с приложением sencha touch, данные должны выглядеть следующим образом после «переформатирования» их с помощью службы PHP:

$result = array(
'items' => [
[
'title' => 'gastronomy',
'items' => [
[
'title' => 'restaurants',
'items' => [
[
'title' => 'italians',
'items' => [
[
'title' => 'Al Castello',
'leaf' => true
],

[
'title' => 'Italia',
'leaf' => true
]
]
],

[
'title' => 'asians',
'items' => [
[
'title' => 'Gautam',
'leaf' => true
],

[
'title' => 'Wok',
'leaf' => true
]
]
]
]
]
]
]
]
);

Я пробовал все, о чем мог думать, но безуспешно. Что меня действительно беспокоит, так это то, что все ключи должны быть переименованы в элементы. (Мне трудно получить доступ к более глубоким вложенным элементам из-за этого, когда я использую рекурсивную функцию)

0

Решение

Я не проверял это, но похоже, что довольно простая рекурсивная функция должна справиться с этим.

Например:

function parseApi($arr) {
$result = array();
foreach ($arr as $key => $value) {
if (isset($value['leaf'])) {
$result[] = $value;
} else {
$result[] = array(
'title' => $key,
'items' => parseApi($value)
);
}
}

return $result;
}

$result = array( 'items' => $parseApi($quest);
0

Другие решения

Вам нужна рекурсивная функция, и она должна уметь различать ассоциативные и численно индексированные массивы.

// from: http://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential
function isAssoc($arr) { return array_keys($arr) !== range(0, count($arr) - 1); }

function itemize($foo) {
$output = [];
if( ! isAssoc($foo) ) {
foreach( $foo as $value ) {
if( is_array($value) ) {
$output[] = itemize($value);
} else {
$output[] = $value;
}
}
} else {
foreach( $foo as $key => $value ) {
if( is_array($value) ) {
$output[] = [
'title' => $key,
'items' => itemize($value)
];
} else {
$output[$key] = $value;
}
}
}
return $output;
}

echo json_encode(itemize($quest), JSON_PRETTY_PRINT);

Выход:

[
{
"title": "gastronomy",
"items": [
{
"title": "restaurants",
"items": [
{
"title": "italians",
"items": [
{
"title": "Al Castello",
"leaf": true
},
{
"title": "Italia",
"leaf": true
}
]
},
{
"title": "asians",
"items": [
{
"title": "Gautam",
"leaf": true
},
{
"title": "Wok",
"leaf": true
}
]
}
]
}
]
}
]
0

По вопросам рекламы [email protected]