为了账号安全,请及时绑定邮箱和手机立即绑定

xml 子级中的图像名称超过一个并受到 php 的限制

xml 子级中的图像名称超过一个并受到 php 的限制

PHP
潇湘沐 2023-08-11 15:56:22
我有 xml,另一个数组我得到了,但第一个数组不能我该如何解决这个问题像这样的xml结构并在xml到php中获取错误代码第一个不是数组第二个是数组我无法获得第一张图片,孩子们"sitename/11.jpg"像这样的xml [images] => SimpleXMLElement Object ( [image] => Array ( [0] => sitename/15.jpg [1] => sitename/16.jpg [2] => sitename/17.jpg [3] => sitename/18.jpg ) ) ) [images] => SimpleXMLElement Object ( [image] => sitename/11.jpg ))<root><result><node><categories>somecategory<categories/><images><image>sitename/15.jpg</image><image>sitename/16.jpg</image><image>sitename/17.jpg</image><image>sitename/18.jpg</image></images></node><node><categories>somecategory<categories/><images><image>sitename/11.jpg</image></images></node>  </result>      </root>function solve_something($xml, $destination){    $xml = simplexml_load_file($xml, "SimpleXMLElement", LIBXML_NOCDATA);    $json = json_encode($xml);    $items = json_decode($json, TRUE);    $products = array();    $product_data = array();    $row = 1;foreach ($items['result']['node'] as $item) {    $product_data['Categories'] = 'categories';    if (isset($item['images']['image'])) {        if (is_array($item['images']['image'])) {            foreach ($item['images']['image'] as $key => $image) {                $key++;                if ($key <= 4) {                    $image_name = 'image' . $key;                    $product_data[$image_name] = isset($image) ? $image : null;                }            }        } else {            $product_data['image'] = isset($image) ? $image : null;        }    }$path = createXML($products, $destination);return $path;}
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

代码有几个问题

  • 如果你想要3张图片,这部分if ($key <= 4) {应该小于或等于2。

  • save当您编写文件时,函数返回时,您实际上不必返回任何内容(或者您想检查是否为 false)the number of bytes written or false if an error occurred.

  • 在 foreach 中像这样使用$key++;也可以使用 for 循环来完成,您可以在$i其中附加image

  • 不知道你为什么要使用,createCDATASection但我已经保留了该部分以获得所需的结果

  • 由于 的多个部分node,您可以$product_data在每次迭代中使用一个数组来将值添加到 foreach 添加到数组中以及之后添加$product_data$products数组中,以防止覆盖每个循环的值。

更新后的代码可能看起来像

function solve_something($xml, $destination)

{

    $xml = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA);

    $json = json_encode($xml);

    $items = json_decode($json, TRUE);

    $products = array();


    foreach ($items['result']['node'] as $item) {

        $product_data = array();

        $category = $item["categories"];

        $product_data["categories"] = $category;

        if (isset($item['images']['image'])) {

            if (is_array($item['images']['image'])) {

                for ($i = 0; $i < count($item['images']['image']); $i++) {

                    if ($i < 3) $product_data["image" . ($i + 1)] = $item['images']['image'][$i];

                }

            } else $product_data["image1"] = $item['images']['image'];

        }

        $products[] = $product_data;

    }

    createXML($products, $destination);

}


function createXML($data, $destination)

{

    $xmlDoc = new DOMDocument('1.0', 'UTF-8');

    $root = $xmlDoc->appendChild($xmlDoc->createElement("root"));


    foreach ($data as $key => $product) {

        $productA = $root->appendChild($xmlDoc->createElement('product'));

        $imagesElm = $xmlDoc->createElement('images');

        foreach ($product as $key1 => $val) {

            if ($key1 == 'price' || $key1 == 'tax' || $key1 == 'stockAmount' || $key1 === "categories") {

                $productA->appendChild($xmlDoc->createElement($key1, $val));

            } elseif (substr($key1, 0, 5) === "image") {

                $imagesElm->appendChild($xmlDoc->createElement($key1, $val));

            }

        }

        $productA->appendChild($imagesElm);

    }


    $xmlDoc->formatOutput = true;

    $xmlDoc->save($destination);

}


$xml = <<<XML

<?xml version="1.0" encoding="utf-8"?>

<root>

    <result>

        <node>

            <categories>somecategory</categories>

            <images>

                <image>sitename/15.jpg</image>

                <image>sitename/16.jpg</image>

                <image>sitename/17.jpg</image>

                <image>sitename/18.jpg</image>

            </images>

        </node>

        <node>

            <categories>somecategory</categories>

            <images>

                <image>sitename/11.jpg</image>

            </images>

        </node>

    </result>

</root>

XML;


solve_something($xml, "result.xml");

xmlresult.xml看起来像


<?xml version="1.0" encoding="UTF-8"?>

<root>

  <product>

    <categories>somecategory</categories>

    <images>

      <image1>sitename/15.jpg</image1>

      <image2>sitename/16.jpg</image2>

      <image3>sitename/17.jpg</image3>

    </images>

  </product>

  <product>

    <categories>somecategory</categories>

    <images>

      <image1>sitename/11.jpg</image1>

    </images>

  </product>

</root>


查看完整回答
反对 回复 2023-08-11
  • 1 回答
  • 0 关注
  • 58 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信