Php 从eshop XML文件获取所有可能的产品参数

Php 从eshop XML文件获取所有可能的产品参数,php,xml,arrays,multidimensional-array,Php,Xml,Arrays,Multidimensional Array,我对PHP中的数组可能有一个非常简单的问题,即使在广泛的互联网搜索的帮助下,我似乎也无法解决这个问题 我正试图为我自己的dropshipping业务解析从供应商的eshop导出的XML文件。具体来说,我正试图将所有可能的产品参数组织到一个可读的数组中,该数组可以插入到我的数据库中,并链接到各个产品。源XML如下所示: <SHOPITEM> <ID>...</ID> <PRODUCT>...</PRODUCT> &

我对PHP中的数组可能有一个非常简单的问题,即使在广泛的互联网搜索的帮助下,我似乎也无法解决这个问题

我正试图为我自己的dropshipping业务解析从供应商的eshop导出的XML文件。具体来说,我正试图将所有可能的产品参数组织到一个可读的数组中,该数组可以插入到我的数据库中,并链接到各个产品。源XML如下所示:

<SHOPITEM>
    <ID>...</ID>
    <PRODUCT>...</PRODUCT>
    <PRICE>...</PRICE>    

    <PARAM>
        <PARAM_NAME>Param name 1</PARAM_NAME>
        <VAL>Param value 1</VAL>
    </PARAM>
    <PARAM>
        <PARAM_NAME>Param name 2</PARAM_NAME>
        <VAL>Param value 1</VAL>
    </PARAM>
    ...
    <PARAM></PARAM>
    <PARAM></PARAM>
</SHOPITEM>
...
<SHOPITEM></SHOPITEM>
...
Array
(
    [Parameter1] => Array
        (
        [0] => Value for Parameter1
        [1] => Value for Parameter1
        [2] => Value for Parameter1
        )
    [Parameter2] => Array
        (
        [0] => Value for Parameter2
        [1] => Value for Parameter2
        [2] => Value for Parameter2
        )
)
在我看来,PHP代码工作得很好,但它总是返回空的2级数组:

编辑:多亏了赫伯特的回答,我才稍微澄清了代码。现在的问题似乎是嵌套数组(
$array[$param_name]
)中的值总是在索引0处被替换,而不是添加到数组中。我对这种行为感到困惑

$file = simplexml_load_file("sourceFile.xml");

$array = array();

foreach ($file->SHOPITEM as $shopitem) {
    foreach ($shopitem->PARAM as $param) {
        $param_name = (string)$param->PARAM_NAME;
        $param_val  = (string)$param->VAL;

        if(!in_array($param_name, $array)) {
            $array[$param_name] = array();
        }

        if(!in_array($param_val, $array[$param_name])) {

            array_push($array[$param_name], $param_val);
            //same as: $array[$param_name][] = $param_val;
    }
}

欢迎您提供任何见解,谢谢。

从我看到的情况来看,您没有使用
$params\u array
更新
$array
变量

试试这个:


解决了!没有添加值的原因是因为这两个操作都在一个循环中-可能与全局变量和局部变量有关。这是有效的代码:

$file = simplexml_load_file("ExportZbozi.xml");

$array = array();

foreach ($file->SHOPITEM as $shopitem) {
    foreach ($shopitem->PARAM as $param) {
        $param_name = (string)$param->PARAM_NAME;

        if(!in_array($param_name, $array)) {
            $array[$param_name] = array();
        }
    }
}

foreach ($file->SHOPITEM as $shopitem) {
    foreach ($shopitem->PARAM as $param) {
        $param_name = (string)$param->PARAM_NAME;
        $param_val  = (string)$param->VAL;

        if(!in_array($param_val, $array[$param_name])) {
            $array[$param_name][] = $param_val;
        }
    }
}

下面的示例将数组用作映射,因此每个值只存在一次,因为该值也用作键。这大大简化了您的任务:

$array = array();

foreach ($file->SHOPITEM as $shopitem)
{
    foreach ($shopitem->PARAM as $param) 
    {
        $name = (string)$param->PARAM_NAME;
        $val  = (string)$param->VAL;

        $array[$name][$value] = 1;
    }
}

如果以后要更改,请在第二级/内部值数组上使用。

从技术上讲,您只需要一个循环。不,这不是关于局部变量和全局变量(这里都在同一个范围内),只是犯了一些错误。您通过将一个循环分为两个循环来管理它,以避免再次犯相同的错误,因此它现在可以工作了。
$array = array();

foreach ($file->SHOPITEM as $shopitem)
{
    foreach ($shopitem->PARAM as $param) 
    {
        $name = (string)$param->PARAM_NAME;
        $val  = (string)$param->VAL;

        $array[$name][$value] = 1;
    }
}