0

在询问之前,我曾尝试自己找出答案,但无法真正弄清楚。

我所拥有的是一个循环,它实际上是一个使用 simplexml_load_file 读取 XML 数据的循环

现在这个 XML 文件有我想读取并放入数组的数据.. 实际上是一个二维数组..

因此,XML 文件有一个名为 Tag 的子文件和一个名为 Amount 的子文件。金额总是不同的,但标签通常是相同的,但有时也会发生变化。

我现在想做的是:

例子:

这是 XML 示例:

<?xml version="1.0"?>
<Data>
<Items>
    <Item Amount="9,21" Tag="tag1"/>
    <Item Amount="4,21" Tag="tag1"/>
    <Item Amount="6,21" Tag="tag2"/>
    <Item Amount="1,21" Tag="tag1"/>
    <Item Amount="6,21" Tag="tag2"/>

</Data>
</Items>

现在我有一个循环读取这个,查看它是什么标签并将数量加起来。它适用于 2 个循环和两个不同的数组,我想在一个循环中将它们全部放在一个数组中。

我试过这样的事情:

$tags = array();
        for($k = 0; $k < sizeof($tags); $k++)
        {
                if (strcmp($tags[$k], $child['Tag']) == 0)
            {
                $foundTAG = true;
                break;
            }
            else
                $foundTAG = false;
        }


        if (!$foundTAG)
        {
            $tags[] = $child['Tag'];
        }

然后在代码中的某处我尝试了添加到数组的不同变体($counter 是一起计算 Amounts 的值):

$tags[$child['Tag']][$k] = $counter;
$tags[$child['Tag']][] = $counter;
$tags[][] = $counter;

我尝试了一些我已经删除的其他组合,因为它不起作用..

好的,这可能是一个非常菜鸟的问题,但我昨天开始使用 PHP,不知道多维数组是如何工作的 :)

谢谢

4

1 回答 1

1

这是您可以从简单的 xml 迭代返回的对象的方法:

$xml=simplexml_load_file("/home/chris/tmp/data.xml");
foreach($xml->Items->Item as $obj){
    foreach($obj->Attributes() as $key=>$val){
        // php will automatically cast each of these to a string for the echo
        echo "$key = $val\n";
    }
}

因此,要为每个标签构建一个包含总计的数组:

$xml=simplexml_load_file("/home/chris/tmp/data.xml");
$tagarray=array();
// iterate over the xml object
foreach($xml->Items->Item as $obj){
    // reset the attr vars.
    $tag="";
    $amount=0;
    // iterate over the attributes setting
    // the correct vars as you go
    foreach($obj->Attributes() as $key=>$val){
        if($key=="Tag"){
            // if you don't cast this to a
            // string php (helpfully) gives you
            // a psuedo simplexml_element object
            $tag=(string)$val[0];
        }
        if($key=="Amount"){
            // same as for the string above
            // but cast to a float
            $amount=(float)$val[0];
        }
        // when we have both the tag and the amount
        // we can store them in the array
        if(strlen($tag) && $amount>0){
            $tagarray[$tag]+=$amount;
        }
    }
}
print_r($tagarray);
print "\n";

如果架构更改或您决定穿蓝色袜子(xml 对颜色非常敏感),这将严重破坏。正如您所看到的,处理 xml 的问题子项很乏味 - 在委员会会议室做出的另一个设计决定 :-)

于 2013-10-09T15:14:59.537 回答