Мой код:
$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";
}
}
моя проблема: просто еще часть работает, и если условие не работает, но когда я удаляю еще часть, если часть работает хорошо. Вы можете помочь мне??
$customers - это строка, вы не можете зацикливаться на строке
$customers — это JSON, который еще нужно расшифровать. Смотрите: 3v4l.org/ciMLm
Ваша логика не имеет большого смысла для начала - вы не можете вывести No customer found with this name
, пока вы все еще перебираете данные. Он вывел бы этот текст, если бы первый клиент не был sara
, даже если второй был sara
. Вы можете определить, что sara
не был найден, только после того, как вы перебрали всех клиентов.
Всегда убедитесь, что вы предоставили минимальный воспроизводимый пример проблемы, пожалуйста (см. Также Как спросить). Если это ваш реальный код, то начинать с него совершенно бессмысленно, как уже упоминалось. Строка JSON не является массивом. Для этого его нужно расшифровать.
извините, я забыл написать декодирование json здесь, я редактирую вопрос, это пример кода, и я пишу для сокращения текста
Инициализируйте логический флаг $found = false;
перед циклом, а внутри, если вы нашли пользователя, установите для него значение true. Проверьте, что он содержит после цикла.
В качестве альтернативы вы можете использовать переменную, чтобы цикл либо возвращал желаемого клиента, либо нет. Вот так: 3v4l.org/Ce9T4
Создайте логическую переменную с помощью 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";
}
Этот код не такой гибкий, каким мог бы быть. Что, если программист захочет добавить возраст клиента или адрес? Ваш код будет раздуваться без уважительной причины.
Это не может быть ваш фактический код, вы не можете foreach по строковому значению. Идите и включите правильные отчеты об ошибках PHP, тогда он скажет вам, что не так.