【问题标题】:Foreach loop adding last result onto nextForeach 循环将最后一个结果添加到下一个
【发布时间】:2016-03-01 04:28:31
【问题描述】:

我一直在尝试使用 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 文件,因为它预先添加了所有内容。这是我做循环的 PHP 代码。

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() 来尝试纠正这个问题,但没有成功。非常感谢任何帮助。

【问题讨论】:

    标签: php xml loops foreach


    【解决方案1】:

    您需要在 $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
            );
        }
    }
    

    【讨论】:

    • 太棒了!!非常感谢,这么简单的修复!
    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2020-11-02
    • 2018-06-05
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多