2013-09-11 3 views
1

Мой проект в CakePHP, но я думаю, что это является одним из аспектов родной PHP, что я недоразумение ..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:

Illegal строку смещения 'Сервис'

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

UPDATE:

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

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

+0

Посмотрите на этот ответ: http://stackoverflow.com/a/16264301/577470 также: http://stackoverflow.com/questions/9869150/illegal-string-offset-warning-php – rodrigoio

ответ

1

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

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

0

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

$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) 

Должно быть, есть причина. Будет иметь коп ...

+0

Что здесь происходит, так это то, что «Сервис» недействителен как строковый индекс. Если вы включили предупреждения, вы получите сообщение «PHP Warning: Illegal offset offset» Service ... Однако, помимо предупреждения, PHP с радостью попытается что-то сделать, поэтому он преобразует недопустимый индекс в 0. $ model [ 'Service'] возвращает '2', поэтому $ model ['Service'] [0] также является «2».См. Ссылку, приведенную выше. –

Смежные вопросы