#php #json
#php #json
Вопрос:
Я пытаюсь получить имена категорий, которые поставляются с Json. Эта категория распадается с добавлением. По этой причине мне нужно получать имена категорий в цикле.
JSON
[
{
"GUID": "d8fced8f-f751-43a8-a94f-18c613869d29",
"Code": "100101",
"MainUnit": "12",
"ProductCategory": {
"ID": 263,
"Name": "Category 5",
"MainCategory": false,
"ParentCategoryID": 262,
"ParentCategory": {
"ID": 262,
"Name": "Category 4",
"MainCategory": false,
"ParentCategoryID": 153,
"ParentCategory": {
"ID": 153,
"Name": "Category 3",
"MainCategory": false,
"ParentCategoryID": 152,
"ParentCategory": {
"ID": 152,
"Name": "Category 2",
"MainCategory": false,
"ParentCategoryID": 2,
"ParentCategory": {
"ID": 2,
"Name": "Category 1",
"MainCategory": true,
"ParentCategory": null,
"ParentCategoryID": 0
}
}
}
}
},
"Brand": ""
}
]
CURL
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'http://example.com/json/products',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Bearer gd6yaw7gjiLQ8VeytrpLrl9'
),
));
$response = curl_exec($curl);
curl_close($curl);
$response = json_decode($response);
foreach($response as $return){
function displayRecursiveResults($arrayObject) {
foreach($arrayObject as $key=>$data) {
if(is_array($data)) {
displayRecursiveResults($data);
} elseif(is_object($data)) {
displayRecursiveResults($data);
} else {
echo $data.'<br />';
}
}
}
displayRecursiveResults($return->ProductCategory);
}
Внутри функции displayRecursiveResults я создал цикл для получения категорий. В этом цикле используются не только имена категорий, но и другие параметры.
Вывод:
263
Category 5
262
262
Category 4
153
153
Category 3
152
152
Category 2
2
2
Category 1
1
0
я хочу напечатать так: Категория 5-> Категория 4-> Категория 3-> Категория 2-> Категория 1
Комментарии:
1. Некоторое представление о структуре JSON, с которой вы пытаетесь работать, облегчило бы ответ.
2. @NigelRen да, я пропустил это, я добавил сейчас
Ответ №1:
То, что вы пытаетесь сделать, называется breadcrumbs .
Я написал короткую функцию, которая делает то, что вам нужно. Просто используйте это в своем коде, и панировочные сухари должны работать.
<?php
$json = '{"GUID": "d8fced8f-f751-43a8-a94f-18c613869d29",
"Code": "100101",
"MainUnit": "12",
"ProductCategory": {
"ID": 263,
"Name": "Category 5",
"MainCategory": false,
"ParentCategoryID": 262,
"ParentCategory": {
"ID": 262,
"Name": "Category 4",
"MainCategory": false,
"ParentCategoryID": 153,
"ParentCategory": {
"ID": 153,
"Name": "Category 3",
"MainCategory": false,
"ParentCategoryID": 152,
"ParentCategory": {
"ID": 152,
"Name": "Category 2",
"MainCategory": false,
"ParentCategoryID": 2,
"ParentCategory": {
"ID": 2,
"Name": "Category 1",
"MainCategory": true,
"ParentCategory": null,
"ParentCategoryID": 0
}
}
}
}
},
"Brand": ""
}';
echo createBreadcrumbs(json_decode($json, true));
function createBreadcrumbs(array $product): string
{
// Check if the product has a category
$categories = isset($product['ProductCategory']) ? $product['ProductCategory'] : [];
$breadcrumbs = empty($categories) ? '' : $categories['Name'];
while (isset($categories['ParentCategory'])) {
$categories = $categories['ParentCategory'];
$breadcrumbs .= '->' . $categories['Name'];
}
return $breadcrumbs;
}
Модифицированная функция, которая возвращает массив категорий:
// Array with all category names of the product
$productCategories = createBreadcrumbs(json_decode($json, true));
print_r($productCategories);
function createBreadcrumbs(array $product): array
{
// Check if the product has a category
$categories = isset($product['ProductCategory']) ? $product['ProductCategory'] : [];
$breadcrumbs = empty($categories) ? [] : [$categories['Name']];
while (isset($categories['ParentCategory'])) {
$categories = $categories['ParentCategory'];
array_push($breadcrumbs, $categories['Name']);
}
return $breadcrumbs;
}
Комментарии:
1. К сожалению, это не сработало, мне нужно создать структуру, подобную приведенному выше примеру. Он выдал ошибку. Неустранимая ошибка: неперехваченная ошибка типа: аргумент 1, переданный createBreadcrumbs(), должен иметь тип array, object given, вызываемый в
2. @codefile вы вызывали функцию, как я, со вторым параметром в json_decode (true)? Потому что функция createBreadcrumbs требует массива в качестве параметра. Когда вы вызываете json_decode только с одним параметром, он возвращает объект вместо массива.
3. echo createBreadcrumbs(json_decode($response, true));
4. Теперь это так, большое вам спасибо. Я допустил ошибку.
5. Последний вопрос: я должен распечатать эти категории в базе данных. Как я могу сохранить каждую категорию по отдельности? prnt.sc/z3p7hl