我在PHP中有一个非常简单的数组问题,即使在广泛的互联网搜索的帮助下,我似乎无法弄清楚。
我正在尝试解析供应商电子商店的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处得到REPLACED,而不是添加到数组中。我对这种行为感到困惑。
$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;
}
}
热烈欢迎任何见解,谢谢。
答案 0 :(得分: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
}
}
答案 1 :(得分: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;
}
}
}
答案 2 :(得分: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()
。