#php #json #parsing #decode
#php #json #синтаксический анализ #расшифровать
Вопрос:
Мне нужна помощь в синтаксическом анализе и просмотре результатов JSON с помощью PHP. В приведенном ниже примере мне нужно проверить категории технологии.
Результат, который я ожидаю, заключается в том, что если категория analytics была найдена, пометить это переменной true, а также установить переменную с именем аналитики, например «google Analytics»
Это пример кода
foreach ($resp['technologies'] as $item) {
if ($item['categories'][0] === 'analytics') {
$found = true;
$analyticsis= $item['name'];
Это пример JSON, который мы просматриваем.
[{
"url": "https://www.websiteexample.co.uk",
"technologies": [{
"slug": "google-analytics",
"name": "Google Analytics",
"versions": [],
"trafficRank": 0,
"categories": [{
"id": 10,
"slug": "analytics",
"name": "Analytics"
},
{
"id": 61,
"slug": "saas",
"name": "SaaS"
}
]
}
Комментарии:
1. Используйте правильный ключ
$item['categories'][0]['name']
.
Ответ №1:
Прежде всего, json
это строка.
Если у вас есть json, он должен быть проанализирован:
$data = json_decode($json, true);
Если ваш «json» является массивом, это не json, это массив.
Поиск
Просто перейдите в свою структуру, и когда вы нашли то, что искали, остановитесь и сохраните все необходимые данные:
$json = <<<'JSON'
[{
"url": "https://www.websiteexample.co.uk",
"technologies": [{
"slug": "google-analytics",
"name": "Google Analytics",
"categories": [
{"id": 10, "slug": "analytics", "name": "Analytics"},
{"id": 61, "slug": "saas", "name": "SaaS"}
]
}]
}]
JSON;
$data = json_decode($json, true);
$needle = 'analytics';
$foundTech = null;
$foundCategory = null;
foreach ($data as $resp) {
foreach ($resp['technologies'] as $tech) {
foreach ($tech['categories'] as $category) {
if ($category['slug'] === $needle) {
$foundTech = $tech;
$foundCategory = $category;
break 3;
}
}
}
}
if ($foundCategory) {
echo $foundTech['name'], PHP_EOL;
echo $foundCategory['name'], PHP_EOL;
}
Google Analytics Analytics
Если вам нужно более одного поиска в этой структуре, было бы разумно создать некоторые карты / индексы раньше.
Комментарии:
1. Спасибо — это действительно помогло.
Ответ №2:
$item['categories'][0]
является ассоциативным массивом и analytics
находится в slug
элементе.
if ($item['categories'][0]['slug'] == 'analytics') {
$found = true;
$analyticsis = $item['name'];
}
Вероятно, вам следует искать по всем категориям, а не просто проверять [0]
.
foreach ($item['categories'] as $category) {
if ($category['slug'] == 'analytics') {
$found = true;
$analyticsis = $item['name'];
break;
}
}
Комментарии:
1. В данном примере он вернет false как
Analytics != analytics
2. Правильно, я перешел на сопоставление
slug
.