Я пытаюсь получить значение определенного ключа, если существует другой ключ. Это json, который у меня есть

{
  "data": {
    "fields": [
      {
        "name": "test 1",
        "value": true
      },
      {
        "name": "another field",
        "value": "some value"
      },
      {
        "name": "another field",
        "value": "some value"
      }
    ]
  }
}

Тогда у меня есть этот код

$json = json_decode($json, true);

foreach ($json['data']['fields'] as $array) {
    if ($array['name'] == "test 1") {
        if ($array['value'] === true) {
            $stat = "Yes";
        } else {
            $stat = "No";
        }
    }
}

Но по какой-то причине $stat печатает "да", даже если ключ "test 1" не существует в полях. Не могу понять, что делаю не так.

ОБНОВЛЕНИЕ и решение

Приведенный выше код является частью цикла MySQL while. Как отметил Найджел Рен , я не устанавливал $stat каждый раз, когда начинаю новый while loop, из-за чего он был установлен на Yes, даже если ключ test 1 не существует.

Установка $stat до foreach устранила проблему

-2
lStoilov 24 Фев 2021 в 12:20

2 ответа

Лучший ответ

Поскольку вы никогда не устанавливали $stat, за исключением случаев, когда это значение найдено, значение будет перенесено в другие элементы.

Так же, как быстрая смена кода ...

$json = json_decode($json, true);
$stat = "No";

foreach ($json['data']['fields'] as $array) {
    if ($array['name'] == "test 1") {
        if ($array['value'] === true) {
            $stat = "Yes";
        }
        break;
    }
}

break; также остановится, как только элемент будет найден.

1
Nigel Ren 24 Фев 2021 в 09:54

Я считаю это логической ошибкой. Вам не хватает лишнего else. В вашем примере код найдет значение в первом цикле и установит для $ stat значение «да». Но затем в следующем цикле имя не «тест 1», поэтому оно не может перейти в if и изменить значение на «Нет».

Однако, если ни одно из значений не равно «тесту 1», то он уже вернет «Нет» правильно.

Кроме того, то, где вы выводите $ stat и как вы управляете им в цикле, зависит от того, пытаетесь ли вы проверить:

А) значение существует в каждом объекте индивидуально, или

Б) хотя бы в одном из предметов, или

В) во всех из них.

На самом деле немного неясно, какова должна быть цель кода.

Этот код будет реализовывать версию (а) выше:

$json = json_decode($json, true);

foreach ($json['data']['fields'] as $array) {
    if ($array['name'] == "test 1") {
        $stat = ($array['value'] === true ? "Yes" : "No");
    }
    else $stat = "No";

    echo $stat;
}
1
ADyson 24 Фев 2021 в 09:40