PHP isset возвращает true, но должно быть false

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

у меня есть afterFind($results, $primary = false) метод обратного вызова в моем AppModel, На одной конкретной находке, если я debug($results); Я получаю массив, как это

array(
    'id' => '2',
    'price' => '79.00',
    'setup_time' => '5',
    'cleanup_time' => '10',
    'duration' => '60',
    'capacity' => '1',
    'discontinued' => false,
    'service_category_id' => '11'
)

В моем afterFind У меня есть такой код:

foreach($results as &$model) {
  // if multiple models
  if(isset($model[$this->name][0])) {
    ....

Результаты находки взяты из моего Service модель так вставив, что для $this->name и проверка if(isset($model['Service'][0])) должен вернуть false, но он возвращает true? if(isset($model['Service'])) возвращает false, как и ожидалось.

Я получаю следующее предупреждение PHP:

Недопустимое смещение строки 'Сервис'

так что здесь происходит? Почему if(isset($model['Service'][0])) вернуть true, если if(isset($model['Service'])) возвращает ложь?

ОБНОВИТЬ:

Я до сих пор не знаю ответа на свой первоначальный вопрос, но я обошел его, сначала проверив, является ли $results многомерным массивом с

if(count($results) != count($results, COUNT_RECURSIVE))

2 ответа

Решение

Использование array_key_exists() или же empty() вместо isset(), PHP странно кэширует старые значения массива. Они должны быть сброшены вручную с помощью unset()

isset() не возвращает TRUE для ключей массива, соответствующих значению NULL, в то время как array_key_exists() делает.

Смещение строк обеспечивает механизм для использования строк, как если бы они были массивом символов:

$string = 'abcde';
echo $string[2]; // c

$model действительно строка для всех ключей, кроме прекращенных.

Для isset($model['Service'][0]) Возвращаемое значение, я немного удивлен. Это упрощенный тестовый пример:

$model = '2';
var_dump(isset($model['Service'])); // bool(false)
var_dump(isset($model['Service'][0])); // bool(true)

Где-то должна быть причина. Придется копать..

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