Ошибка отображается в журналах сервера ... Как я могу остановить это? - PullRequest
0 голосов
/ 21 марта 2009

Я получаю сообщение об ошибке, и я погуглил все, что только могу придумать, практически без какой-либо информации. Может быть, вы можете помочь с новым набором глаз.

У меня есть функция, которая возвращает массив объектов. Код, который вызывает эту функцию, затем перебирает этот массив и делает то, что ему нужно, с каждым объектом. Кажется, он работает визуально, когда выплевывает HTML, но журналы сервера по-прежнему выдают ошибку «Недопустимый аргумент, предоставленный для foreach ()». Да, это здорово, что это работает технически, но я не хочу, чтобы эта ошибка больше появлялась. Мысли

<?php

// The class whose method returns an array of library_Label objects
class library_Label
{
  public $id = null;
  public $name = null;

  public function getChildren()
  {
    // $children is declared earlier
    return $children;
  }
}


// main code
$columns = new library_Label(1);
foreach ($columns->getChildren() as $label) echo $label->Name;

?>

Ответы [ 3 ]

1 голос
/ 21 марта 2009

Предупреждение "Invalid argument supplied for foreach()" возникает при попытке сделать foreach для переменной, которая не является массивом.

Необходимо проверить, что возвращаемое значение из getChildren() на самом деле является массивом.

Мы не можем сказать это из вашего контекста, так как вы не указали ни источника конструктора, ни кода, который фактически создает $children. Если бы это произошло, вам было бы легче помочь.

Вы можете попробовать распечатать возвращаемое значение перед выполнением foreach с "print_r($columns->getChildren())". Это должно быть четкое указание на то, является ли это массивом или нет.

Я бы также предложил проверить, является ли массив пустым, используя empty() или count() - некоторые сайты в сети заявляют, что пустые массивы также вызовут это предупреждение, но у меня нет среды PHP домой, чтобы проверить это.

1 голос
/ 21 марта 2009

Это довольно часто, мое решение всегда изменить это:

foreach ($columns->getChildren() as $label) echo $label->Name;

до

$children = $columns->getChildren();
if (is_array($children)) foreach ($children as $label) echo $label->Name;

Он должен охватывать все ситуации.

Вы также можете развернуть его до полного оператора if с фигурными скобками, а затем включить блок else для обработки ситуации, когда дочерние элементы пусты, если хотите.

1 голос
/ 21 марта 2009

Вы не говорите, какой язык вы используете, но это похоже на ошибку PHP. Если это так, проверьте PHP уровни сообщений об ошибках . Однако вам, вероятно, следует изменить значения в вашем php.ini, чтобы не выгружать другие ошибки в журналы вашего сервера.

Конечно, вы захотите выяснить, почему эта ошибка выдается независимо.

...