我一直在试验SimplXML,从一个非常大的XML文档中解析出一些特定的信息,以创建一个新的简化文档。我正在处理产品,这些产品有一些变化(例如大小),我正试图将其构建到阵列中。一些测试表明,变化循环正在将上一个结果添加到下一个结果上。例如:
第一个循环显示了这一点,这对于具有2个变体的第一个产品是正确的。
["variations"]=>
array(2) {
[0]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090011"
}
}
[1]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090012"
}
}
}
现在,循环中的第二个乘积最终包含最后一个循环结果,并将其添加到自己的结果之前。
["variations"]=>
array(4) {
[0]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090011"
}
}
[1]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090012"
}
}
[3]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090013"
}
}
[4]=>
array(1) {
["sku"]=>
object(SimpleXMLElement)#19 (1) {
[0]=>
string(8) "00090014"
}
}
}
正如你所能想象的,这最终会导致内存错误,并在最后创建一个巨大的新XML文件,因为它在它之前准备了所有内容。
foreach($data as $element)
{
if ($element->Dir_Name == "Fly Fishing"){
//assign element nodes to variables
$name = $element->PF_Name;
$id = $element->PF_ID;
$description = $element->PF_Description;
$brand = $element->Manufacturer_Brand;
$image = $element->ImageURL;
$category1 = $element->Dir_Name;
$category2 = $element->Group_Name;
$category3 = $element->Cat_Name;
//pull in variations
$item_data = $element->Item;
foreach($item_data->Sku as $variation){
$optionName = $variation->Sku_Name;
$price = $variation->Regular_Price;
$sku = $variation->Item_Code;
$variation_array[] = array(
"optionName" => $optionName,
"price" => $price,
"sku" => $sku
);
}
$products_array[] = array(
"name" => $name,
"description" => $description,
"brand" => $brand,
"image" => $image,
"category1" => $category1,
"category2" => $category2,
"category3" => $category3,
"variations" => $variation_array
);
}
}
我读到一些关于使用unset()试图纠正这一问题的文章,但没有成功。非常感谢您的帮助。
您需要在$data
的每个循环上重置var $variation_array
,以避免它在每个循环中构建。
您可以将其重新声明为空数组,也可以取消设置var:
$variation_array = array();
或
unset($variation_array);
完整代码:
foreach($data as $element)
{
if ($element->Dir_Name == "Fly Fishing"){
//assign element nodes to variables
$name = $element->PF_Name;
$id = $element->PF_ID;
$description = $element->PF_Description;
$brand = $element->Manufacturer_Brand;
$image = $element->ImageURL;
$category1 = $element->Dir_Name;
$category2 = $element->Group_Name;
$category3 = $element->Cat_Name;
//pull in variations
$item_data = $element->Item;
$variation_array = array();
foreach($item_data->Sku as $variation){
$optionName = $variation->Sku_Name;
$price = $variation->Regular_Price;
$sku = $variation->Item_Code;
$variation_array[] = array(
"optionName" => $optionName,
"price" => $price,
"sku" => $sku
);
}
$products_array[] = array(
"name" => $name,
"description" => $description,
"brand" => $brand,
"image" => $image,
"category1" => $category1,
"category2" => $category2,
"category3" => $category3,
"variations" => $variation_array
);
}
}