Мне нужна помощь с синтаксическим анализом и просмотром результата JSON с помощью PHP. В приведенном ниже примере результата мне нужно сравнить категории технологии.

В результате, я ожидал, что, если аналитика категорий была найдена, пометить это с помощью истинной переменной, а также установить переменную с именем аналитики, например "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"
        }
      ]
    }
2
JohnPZ 12 Ноя 2020 в 19:38

2 ответа

Лучший ответ

Прежде всего, 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
vp_arth 12 Ноя 2020 в 17:14

$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;
    }
}
0
Barmar 12 Ноя 2020 в 16:47