2010-09-28 8 views
1

У меня нет абсолютно никакого представления, что я делаю неправильно прямо сейчас. Я думаю, что я умственно истощен, потому что я совершенно не знаю. Вот код, который я использую:Недопустимый аргумент, предоставленный foreach()

if(empty($this->updates) || !is_array($this->updates)) 
    return null; 

foreach($this->updates as $update) 

Это не работает. ОДНАКО, если я делаю print_r ($ this-> updates) перед foreach (и после), он отлично работает. Почему, когда я пытаюсь использовать его в foreach, он притворяется, что массив не существует?

Образец print_r ($ this-> Обновления):

Array 
(
    [0] = Array 
    (
     [id] => 1 
     [name] => test 
    ) 
    [1] = Array 
    (
     [id] => 2 
     [name] => rawr 
    ) 
) 
+1

Эта ошибка обычно возникает, если вы попытаетесь передать любую вещь *, кроме * массива, в 'foreach'. Что возвращает ваш 'print_r'? –

+0

можно ли увидеть результат 'print_r'? – fredley

+0

Можете ли вы использовать результат var_dump ($ this-> updates)? Кроме того, вы должны добавить if (! Isset ($ this-> updates) || empty ($ this-> updates)) – Shikiryu

ответ

1

Поскольку вы не говорите, что $this->updates, я просто предполагаю, что это не является массивом. Здесь у вас есть два варианта:

1- Замените empty() на !is_array(), чтобы проверить, действителен ли $this->updates. Если он пуст, это не имеет значения, то foreach будет просто ничего не делать ...

if(!is_array($this->updates)) 
    return null; 

foreach($this->updates as $update) 

Или если foreach не только обработка вы делаете:

if(empty($this->updates) || !in_array($this->updates)) 
    return null; 

foreach($this->updates as $update) 

2- Force $this->updates к быть массивом

if(empty($this->updates)) 
    return null; 

foreach((array) $this->updates as $update) 
+0

$ this-updates Я уже опубликовал результаты print_r в исходном вопросе – Nathan

+0

@Atrox, эта часть кода выполняется дважды? Может быть, первый проход работает, но не работает на втором (или наоборот)? Потому что там NO, что 'foreach' терпит неудачу, если' $ this-> updates' ** всегда ** действительно массив –

+0

Он выполняется примерно 90 раз на одной странице, а иногда он работает, иногда это не так. Если я использую print_r перед началом foreach он работает в 100% случаев. – Nathan

1

Похоже $this->updates не пуст, но его не массив. Вы можете использовать тест is_array, прежде чем использовать его в foreach:

if(is_array($this->update)) { 
    foreach($this->updates as $update) { 
    ..... 
} 
} 
+0

$ this-updates определенно имеет записи в нем. Для конкретной части кода, над которой я работаю, в обновлениях имеется 27 массивов. Я опубликовал результаты примера print_r в исходном вопросе. – Nathan

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