Почему этот код PHP не выводит значения свойств? - PullRequest
1 голос
/ 17 мая 2011

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

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

$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 выводит правильные значения для $ ячеек [$ i] , которые являются теми же значениями, которые мне не хватает в выводе массива.

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

Я использую PHP v5.2.6

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

Ответ:

foreach($currentProduct as $ProductProperty) becomes
foreach($currentProduct as &$ProductProperty)

Ответы [ 3 ]

1 голос
/ 17 мая 2011

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

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 голос
/ 17 мая 2011

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

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

0 голосов
/ 17 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...