#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 — не моя сильная сторона.