Синтаксический анализ и поиск через JSON в PHP

#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 .