PHP Неопределенные массивы, возвращающие неправильные значения

#php #arrays

#php #массивы

Вопрос:

Может показаться странным задавать такой глупый вопрос. Однако я не могу понять, почему я получаю неправильное значение с таким маленьким фрагментом кода.

Код является:

 <?php
error_reporting(0);
$result_all = 'User not found';
if($result_all['BookingDetail']['BookingReference']){
     echo "<br>Output in if :- ".$result_all['BookingDetail']['BookingReference'];
}else{
     echo "<br>Output in else:- ".$result_all['BookingDetail']['BookingReference'];
}
  

введите описание изображения здесь

Я ожидал, что вывод будет пустым, однако он возвращает первый символ строки. Я знаю, что проверка, если это is_array и isset , решит мою проблему.

Но я хочу понять, почему это происходит?

Комментарии:

1. в вашем коде путаница, вы назначили $result_all в качестве переменной, а в другой строке вы проверяете ее на наличие массива?? как это возможно?

2. Эта переменная является строкой, а не массивом $result_all , вы переопределяете эту переменную на string

Ответ №1:

Проблема:-

Вы присваиваете переменной 'User not found' значение $result_all в вашем скрипте, что делает ее строковой переменной.

Поскольку $result_all это строка, любой индекс, подобный BookingDetail , считается равным 0 для строки, и именно поэтому он выдает первый символ строки

Решение:-

Вам нужно использовать isset() , чтобы проверить, существует индекс или нет?

 <?php
//comment these two lines when code started working fine
error_reporting(E_ALL);
ini_set('display_errors',1);

if( isset( $result_all['BookingDetail']['BookingReference'] ) ){
    echo "<br>Output in if :- ".$result_all['BookingDetail']['BookingReference'];
}else{
    echo "<br>Output in else:- User not found";
}
  

Ответ №2:

Я запускал это на PHP 7.3

Это вывод:

 Output in if :- UIllegal string offset 'BookingReference' on line 5
  

Пожалуйста, рассмотрите возможность обновления вашей версии PHP

Ответ №3:

Потому что вы преобразуете его в массив из-за того же имени переменной.

$result_all в МАССИВЕ, выполнив это $result_all['BookingDetail']['BookingReference']

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

$result_all = 'User not found'; Вывод:- U