2

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

我正在尝试为我自己的直销业务解析从供应商的 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;
    }
}

任何见解都将受到热烈欢迎,谢谢。

4

3 回答 3

0

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

$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;
        }
    }
}
于 2013-07-02T13:45:57.740 回答
0

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

$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_flip()请在第二级/内部值数组上使用。

于 2013-07-03T20:13:35.720 回答
0

据我所知,您没有$array使用$params_array.

尝试这个:

$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();
        }

        $params_array = $array[$param_name];

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

        $array[$param_name] = $params_array;  // update the main array
    }
}
于 2013-07-02T01:00:43.833 回答