Это условие не работает в цикле foreach php

Мой код:

$customers='[
 {
  "id": 1,
  "name": "sara",
  "phone": 1100,
  "mobile": 1111
 },
 {
  "id": 2,
  "name": "ben",
  "phone": 2200,
  "mobile": 2222
 }
]';
$data = json_decode($customers, true);
foreach($data as $a){
    if ($a['name'] == 'sara'){
        $phone = $a['phone'];
        $mobile = $a['mobile'];
        echo "sara's phone is $phone";
        echo "sara's mobile is $mobile";
    }
    else{
    echo "No customer found with this name";
    }
}

моя проблема: просто еще часть работает, и если условие не работает, но когда я удаляю еще часть, если часть работает хорошо. Вы можете помочь мне??

Это не может быть ваш фактический код, вы не можете foreach по строковому значению. Идите и включите правильные отчеты об ошибках PHP, тогда он скажет вам, что не так.

CBroe 30.03.2023 11:14

$customers - это строка, вы не можете зацикливаться на строке

Buttered_Toast 30.03.2023 11:14

$customers — это JSON, который еще нужно расшифровать. Смотрите: 3v4l.org/ciMLm

KIKO Software 30.03.2023 11:16

Ваша логика не имеет большого смысла для начала - вы не можете вывести No customer found with this name, пока вы все еще перебираете данные. Он вывел бы этот текст, если бы первый клиент не был sara, даже если второй был sara. Вы можете определить, что sara не был найден, только после того, как вы перебрали всех клиентов.

CBroe 30.03.2023 11:16

Всегда убедитесь, что вы предоставили минимальный воспроизводимый пример проблемы, пожалуйста (см. Также Как спросить). Если это ваш реальный код, то начинать с него совершенно бессмысленно, как уже упоминалось. Строка JSON не является массивом. Для этого его нужно расшифровать.

ADyson 30.03.2023 11:18

извините, я забыл написать декодирование json здесь, я редактирую вопрос, это пример кода, и я пишу для сокращения текста

alpha acem3 30.03.2023 11:23

Инициализируйте логический флаг $found = false; перед циклом, а внутри, если вы нашли пользователя, установите для него значение true. Проверьте, что он содержит после цикла.

CBroe 30.03.2023 11:27

В качестве альтернативы вы можете использовать переменную, чтобы цикл либо возвращал желаемого клиента, либо нет. Вот так: 3v4l.org/Ce9T4

KIKO Software 30.03.2023 11:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
8
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Создайте логическую переменную с помощью false

Переберите массив и сделайте эту переменную true на случай, если пользователь нашел.

В последней проверяем окончательное значение переменной и если оно равно false, то показываем сообщение No customer found.

Вот динамический функциональный подход:

$data = json_decode($customers, true);

function findCustomerInArr($array,$customerName){
    $customerFound = false;
    foreach($array as $a){
        if (strtolower($a['name']) == strtolower($customerName)){
            $customerFound = true;
            echo $customerName."'s phone is ".$a['phone'].PHP_EOL;
            echo $customerName."'s mobile is ".$a['mobile'].PHP_EOL;
            break;
        }
    }
    if (false == $customerFound){
        echo "No customer found with this name".PHP_EOL;
    }
}

findCustomerInArr($data,'sara');
findCustomerInArr($data,'aliveToDie');

Вывод: https://3v4l.org/fIJXu

Примечание. Вы можете удалить strtolower(), если вам нужно совпадение с учетом регистра.

Вы можете закодировать цикл и условие следующим образом, это может решить проблему.

$customers = '[
 {
  "id": 1,
  "name": "sara",
  "phone": 1100,
  "mobile": 1111
 },
 {
  "id": 2,
  "name": "ben",
  "phone": 2200,
  "mobile": 2222
 }
]';
$data = json_decode($customers, true);

$phone = Null;
$mobile = Null;
$name = "sara";

foreach ($data as $a) {
   if ($a['name'] == $name) {
      $phone = $a['phone'];
      $mobile = $a['mobile'];
      break;
   }
}

if ($phone != Null && $mobile != Null) {
   echo "$name's phone is $phone \n";
   echo "$name's mobile is $mobile";
}else{
   echo "No customer found with this name";
}

Этот код не такой гибкий, каким мог бы быть. Что, если программист захочет добавить возраст клиента или адрес? Ваш код будет раздуваться без уважительной причины.

KIKO Software 30.03.2023 11:50

Другие вопросы по теме