Получение последнего уровня дерева json в переполнении стека

У меня есть дерево JSON с категориями,

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

Например, на этом JSON:

 [
{
"category_id": "3",
"parent_id": "2",
"name": "Women",
"categories": [
{
"category_id": "11",
"parent_id": "3",
"name": "Clothing",
"categories": [
{
"category_id": "30",
"parent_id": "11",
"name": "T-shirts",
"categories": null
},
{
"category_id": "33",
"parent_id": "11",
"name": "jeans",
"categories": null
}
]
}
]
},
{
"category_id": "5",
"parent_id": "2",
"name": "Footwear ",
"categories": [
{
"category_id": "15",
"parent_id": "5",
"name": "Rings",
"categories": [
{
"category_id": "51",
"parent_id": "15",
"name": "Small Leathers",
"categories": null
}
]
},
{
"category_id": "16",
"parent_id": "5",
"name": "Bands",
"categories": [
{
"category_id": "41",
"parent_id": "16",
"name": "boots",
"categories": null
}
]
},
{
"category_id": "48",
"parent_id": "5",
"name": "Bracelets",
"categories": [
{
"category_id": "55",
"parent_id": "48",
"name": "Cocktail",
"categories": null
}
]
}
]
}
]

Результатом будет массив (футболки, джинсы, мелкая кожа, ботинки, коктейль)

Я думал о том, чтобы декодировать его в массиве и фильтровать поиск по массиву со всеми категориями, которые являются нулевыми, но я не уверен, что это лучший вариант, потому что объект имеет разные уровни.

(Простите за английский)

0

Решение

Неверная строка Json. Это можно сделать допустимым, заключив строку json в {}.

$json = '{"categories": [
{
"category_id": "3",
"parent_id": "2",
"name": "Women",
"categories": [
{
"category_id": "11",
"parent_id": "3",
"name": "Clothing",
"categories": [
{
"category_id": "30",
"parent_id": "11",
"name": "T-shirts",
"categories": null
},
{
"category_id": "33",
"parent_id": "11",
"name": "jeans",
"categories": null
}
]
}
]
},
{
"category_id": "5",
"parent_id": "2",
"name": "Footwear ",
"categories": [
{
"category_id": "15",
"parent_id": "5",
"name": "Rings",
"categories": [
{
"category_id": "51",
"parent_id": "15",
"name": "Small Leathers",
"categories": null
}
]
},
{
"category_id": "16",
"parent_id": "5",
"name": "Bands",
"categories": [
{
"category_id": "41",
"parent_id": "16",
"name": "boots",
"categories": null
}
]
},
{
"category_id": "48",
"parent_id": "5",
"name": "Bracelets",
"categories": [
{
"category_id": "55",
"parent_id": "48",
"name": "Cocktail",
"categories": null
}
]
}
]
}
]}';

Расшифруйте строку json в php opject

$json_object = json_decode($json);

Используйте эту рекурсивную функцию, чтобы получить все категории последнего уровня в массиве.

function getLastCategories($object){
$last_categories = array();
if(is_array($object->categories)){
foreach($object->categories as $categories){
$last_categories = array_merge( $last_categories, getLastCategories($categories));
}
}else{
$last_categories[]=$object->name;
}
return $last_categories;
}

print_r(getLastCategories($json_object));

Выход:

Array
(
[0] => T-shirts
[1] => jeans
[2] => Small Leathers
[3] => boots
[4] => Cocktail
)
1

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

Вы можете сделать это с помощью рекурсивных итераторов.

$categories = json_decode($json);

// create the iterator
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($categories));

// iterate recursively
foreach ($iterator as $key => $subcategories) {

// if the 'categories' key is empty for the current level...
if ($key == 'categories' && !$subcategories) {

// then add the value of the 'name' key for the current level to your result array.
$result[] = $iterator->getSubIterator()->offsetGet('name');
}
}

Возможно, это не самый эффективный способ сделать это, но он делает код довольно простым.

1

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