Предупреждение: недопустимое смещение строки в PHP 5.4

Я обновился до PHP 5.4 сегодня и получаю странные предупреждения:

Warning: Illegal string offset 'quote1' in file.php on line 110
Warning: Illegal string offset 'quote1_title' in file.php on line 111

Эти строки являются частью кода:

for($i = 0; $i < 3; $i++) {
    $tmp_url = $meta['quote'. ($i+1)];
    $tmp_title = $meta['quote' . ($i+1) .'_title'];

    if(!empty($tmp_url) || !empty($tmp_title)) {
        $quotes[$src_cnt] = array();
        $quotes[$src_cnt]['url'] = $tmp_url;
        $quotes[$src_cnt]['title'] = $tmp_title;
        $src_cnt++;
    }
}

Итак, строки $tmp_url и $tmp_title.

Почему я получаю это странное предупреждение и каково решение?

Обновление:

Этот код используется в качестве плагина Wordpress. $мета включает в себя:

$meta = get_post_meta($post->ID,'_quote_source',TRUE);

Поэтому я подозреваю, что всякий раз, когда поля кавычек пусты, появляется это предупреждение. Есть ли способ исправить это, когда поля пусты?


person Henrik Petterson    schedule 28.04.2013    source источник
comment
quote1_title и quote1 не существуют в вашем массиве $meta. Можете ли вы показать нам свое содержимое $meta.   -  person Adrian    schedule 28.04.2013
comment
Что показывает var_dump($meta)? Вероятно, это не массив.   -  person Marc B    schedule 28.04.2013
comment
Это плагин для сайта Wordpress: $meta = get_post_meta($post->ID,'_quote_source',TRUE);   -  person Henrik Petterson    schedule 28.04.2013
comment
Смотрите мой обновленный вопрос.   -  person Henrik Petterson    schedule 28.04.2013
comment
Сообщение ясное ($meta — это строка, а не массив), и совет Марка (var_dump()) — это способ узнать наверняка. Тот факт, что код принадлежит неизвестному подключаемому модулю Wordpress, ничего не меняет, потому что подключаемые модули Wordpress также являются кодом PHP.   -  person Álvaro González    schedule 28.04.2013
comment
При выполнении var_dump($meta) на странице, где в полях котировок ничего не было написано, показывает NULL. Это когда я получаю предупреждение. Однако на страницах, где были заполнены поля цитаты, он работает нормально. Как мне это решить?   -  person Henrik Petterson    schedule 28.04.2013


Ответы (2)


Вам нужно убедиться, что $meta на самом деле имеет тип массива. В предупреждении явно указано, что $meta похоже на string , а не на array

Illegal string offset
        ^^^^^^

Чтобы избежать этой ошибки, вы также можете проверить наличие необходимых полей.

for($i = 0; $i < 3; $i++) {
    if ( !is_array($meta) || !array_key_exists('quote'. ($i+1), $meta) ){
         continue;
    }
    // your code
}
person MatthiasLaug    schedule 28.04.2013
comment
При выполнении var_dump($meta) на странице, где в полях котировок ничего не было написано, показывает NULL. Это когда я получаю предупреждение. Однако на страницах, где были заполнены поля цитаты, он работает нормально. Как мне это решить? - person Henrik Petterson; 28.04.2013
comment
проверить на ноль до: isset($meta['quote'. ($i+1)]) или array_key_exists('quote'. ($i+1), $meta) - person MatthiasLaug; 28.04.2013
comment
Не могли бы вы обновить свой ответ с этим предложением. - person Henrik Petterson; 28.04.2013
comment
Я обновил ответ соответственно - person MatthiasLaug; 28.04.2013
comment
Работает отлично! Спасибо, у меня есть последний запрос, прежде чем я приму это как правильное. Не могли бы вы подробно объяснить, что делает этот новый оператор IF? Я просто хочу понять решение. - person Henrik Petterson; 28.04.2013
comment
Кроме того, похоже, что другие люди, использующие этот плагин, испытывают те же ошибки, если вы видите эту тему: wordpress.org/support/topic/ рекомендуется добавить вызов if(!empty) перед запуском цикла for. Это то, что мы сделали здесь, верно? - person Henrik Petterson; 28.04.2013
comment
на самом деле он делает две вещи. 1. проверьте, является ли $meta массивом (is_array) или 2. что ключ существует с array_key_exists в массиве $meta. - person MatthiasLaug; 28.04.2013
comment
Таким образом, это решение заставит эту часть скрипта перестать работать на страницах, где метаданные пусты, верно? - person Henrik Petterson; 28.04.2013
comment
это не остановится, просто пропустите эту часть кода, и я бы использовал isset вместо empty, который больше используется для строк - person MatthiasLaug; 28.04.2013
comment
Итак, в этом случае решение, опубликованное в этой теме, отличается от того, что у нас есть здесь? Я спрашиваю об этом, потому что я буду публиковать это решение для использования другими (конечно, я упомяну вас). - person Henrik Petterson; 28.04.2013
comment
да, это должно решить проблему, указанную в теме - person MatthiasLaug; 28.04.2013
comment
Отлично, спасибо за помощь. Ответ принят. - person Henrik Petterson; 28.04.2013

Если $meta равно null всякий раз, когда нет данных для обработки:

if( !is_null($meta) ){
    for($i = 0; $i < 3; $i++) {
        // ...
    }
}

Вы должны быть в состоянии сделать больше проверок, если это необходимо. Это зависит от того, что должна возвращать эта функция get_post_meta().

person Álvaro González    schedule 28.04.2013
comment
Похоже, что у других людей такая же проблема с этим плагином: wordpress.org/support/topic/ В этой теме предлагается добавить вызов if(!empty) перед запуском цикла for. Не могли бы вы обновить свой ответ этим исправлением, и я приму его как правильный. - person Henrik Petterson; 28.04.2013
comment
Не стесняйтесь отвечать на свой вопрос, Stack Overflow поощряет это. Но если $meta равно нулю, мой ответ должен быть в порядке. - person Álvaro González; 28.04.2013
comment
Странно, решение MatthiasLaug работает. Спасибо, несмотря ни на что. - person Henrik Petterson; 28.04.2013
comment
Это не странно. Это бесконечные способы решения одной и той же проблемы. Вот что я имею в виду, говоря о дополнительных проверках: вам нужно будет выполнять больше или меньше проверок в зависимости от того, что get_post_meta() может вернуть. Просто постарайтесь понять каждый ответ, который у вас есть, и используйте тот, который имеет для вас больше смысла. - person Álvaro González; 28.04.2013