Почему этот PHP-код не выводит значения свойств?

#php #debugging #import #foreach

#php #отладка #импорт #foreach

Вопрос:

Я пытаюсь импортировать файл с разделителями табуляции после загрузки. Основная часть этого выполняется с помощью следующей функции. Я пытаюсь создать массив экземпляров класса. Код следует:

Функция импорта

 $AddedProducts;
function importList($filename)
{
    global $AddedProducts;
    $AddedProducts=array();
    $fileHandle = fopen($filename, "r");
    $currentProduct = new productImport();

      $line=fgets($fileHandle); $line=fgets($fileHandle); //throw away top 2 lines
    echo '<hr>';
    while(true)
    {
        $line = fgets($fileHandle);
        if($line == null)   break;

        $cells=explode('    ', $line);
        $i=0;

        foreach($currentProduct as $ProductProperty)
        {
            if(isset($cells[$i]))
            {
                $ProductProperty = $cells[$i];
                echo $i . '. ' . $cells[$i] . "<br>";
            }
            else return false;
            $i  ;
        }
        echo "<hr>";
        $AddedProducts[]=$currentProduct;
    }
    fclose($fileHandle);
    return true;
}
  

Вывод массива

 <?  
$i=0;
foreach($AddedProducts as $AddedProduct)
{
    $i  ;
    echo "<hr>" . $i . "<br>";
    foreach($AddedProduct as $key=>$value)
    {
        echo $key . ' = ' . $value . '<br>';
    }
}
?> 
  

Разбивка известной информации

  • Конечная длина / размер массива верны. (Должны быть строки в файле — 2)

  • Не имеет особого значения, сколько свойств находится в классе productImport, если это соответствует одинаковому количеству вкладок в строке в считываемом файле.

  • Функция importList выдает правильные значения для $cells[$i], которые являются теми же значениями, которых мне не хватает в выводе массива.

Проблема, по-видимому, либо в том, что значения не присваиваются свойствам, либо свойства не считываются. Я не уверен, почему это так, но я предполагаю, что это потому, что PHP не является моим основным языком и, вероятно, что-то очевидное в циклах foreach 😉

Я использую PHP версии 5.2.6

Что не так с этим кодом?

Ответить:

 foreach($currentProduct as $ProductProperty) becomes
foreach($currentProduct as amp;$ProductProperty)
  

Комментарии:

1. Пожалуйста, опубликуйте ответ в качестве ответа ниже, а не внутри вашего вопроса. Вы также можете принять это, чем.

Ответ №1:

Я думаю, что проблема в этом разделе:

 foreach($currentProduct as $ProductProperty)
        {
            if(isset($cells[$i]))
            {
                $ProductProperty = $cells[$i];        /* this seems to be the problem */
                echo $i . '. ' . $cells[$i] . "<br>";
            }
            else return false;
            $i  ;
        }
  

Согласно руководству по php, Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. таким образом, присваиваемое вами значение отбрасывается после цикла.

Редактировать: Помимо этого, вы просматриваете свойства объекта, и хотя в руководстве это явно не указано, кажется, вам нужно foreach($class as $key => $value) вместо просто foreach($class as $value)

Комментарии:

1. У вас и Lotus Notes есть в основном один и тот же ответ, но у вас есть некоторый код и ссылка на руководство, поэтому я отмечу этот. Просто для справки, мне на самом деле не нужен $key => $value. Спасибо

Ответ №2:

В ваших циклах foreach назначенные переменные, такие как $ProductProperty , не являются ссылками, поэтому они фактически не будут влиять ни на что за пределами цикла.

т.е. $ProductProperty = $cells[$i] влияет только на текущую итерацию.

Ответ №3:

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

Комментарии:

1. «Создание» экземпляра происходит в $AddedProducts[]=$currentProduct;

2. Ну, технически это просто копия. Но теперь я понимаю. Существует ли какое-то соглашение php, позволяющее делать это таким образом? Мне кажется, что было бы намного проще читать код, если бы вы явно создавали новый экземпляр в каждом цикле.

3. Не уверен, что понимаю. Вы имеете в виду в начале цикла $AddedProducts[]=new productImport(); , а затем вызвать $AddedProducts[$i] или аналогичный? Я просто предоставлял области видимости функции один экземпляр, чтобы подготовить все значения, а затем отправить их. Я полагаю, что, если уж на то пошло, это соглашение, которое я перенял из C , PHP — не моя сильная сторона.