Foreach循环将最后一个结果添加到下一个结果


Foreach loop adding last result onto next

我一直在试验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
        );
    }
}