Предупреждение: Незаконно отместване на низ в 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 включва:

$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