【问题标题】:Foreach loop group by XML element value按 XML 元素值的 Foreach 循环组
【发布时间】:2020-05-30 00:38:12
【问题描述】:

我想按代理分组

XML 结构如下

<library>
    <document>
        <ProductName>somename1</ProductName>
        <productAgent>Agent-01</productAgent>
        <productType>Goods</productType>
    </document>
        <ProductName>somename3</ProductName>
        <productAgent>Agent-02</productAgent>
        <productType>Services</productType>
    </document>
    ......
</library>

期待输出

<ul>
    <li>Agent-01(productAgent)
        <ul>
            <li>somename1 - Goods</li>
        </ul>
    </li>
    <li>Agent-02(productAgent)
        <ul>
            <li>somename3 - Services</li>
            <li>somename6 - Goods</li>
        </ul>
    </li>
</ul>

我尝试了什么

<ul>
    <li>Agent-01(productAgent)
        <ul>
            <?php foreach($xml->document as $item){     
                if ($item->productAgent == 'Agent-01' ) {
                    echo '<li>'.$item->ProductName.'-'.$item->ProductType.'</li>';
                }
            } 
            ?>
        </ul>
    </li>
    <li>Agent-02(productAgent)
        <ul>
            <?php foreach($xml->document as $item){     
                if ($item->productAgent == 'Agent-02' ) {
                    echo '<li>'.$item->ProductName.'-'.$item->ProductType.'</li>';
                }
            } 
            ?>
        </ul>
    </li>
</ul>

问题

每次代理名称更改时,我都必须修改我的代码。当代理数量增加时,我的代码似乎不是一个好的解决方案。

【问题讨论】:

  • 因此将数据收集到数组中,其中键是代理名称,值是产品。

标签: php xml api foreach


【解决方案1】:

将所有数据收集到数组中,其中key是agent,value是products数组:

<?php 
$values = [];
foreach($xml->document as $item){     
    $agent = (string) $item->productAgent;
    if (!isset($values[$agent])) {
        $values[$agent] = [];
    }

    $values[$agent][] = (string) $item->ProductName;
    // add other tags as you need:
    //$values[$agent][] = [
    //    'name' => (string) $item->ProductName, 
    //    'type' => (string) $item->ProductType,
    //];
}

// Then iterate over this array and output as needed
foreach ($values as $agent => $products) {
    echo $agent . ': ' . implode(', ', $products);
    // iterate over $products and output what you need
}?>

【讨论】:

  • 产品类型也需要打印。我已经编辑了问题供您参考
  • $values[$agent][] = [(string) $item-&gt;ProductName, (string) $item-&gt;ProductType ]; 和同样的方法。
【解决方案2】:

一个更完整的输出示例...

//  Build list of product names for each agent
$agents = [];
foreach ( $xml->document as $document ) {
    $agents [(string)$document->productAgent][] = (string)$document->ProductName;
}

?>
<ul>
    <?php // Loop over the agents
           foreach($agents as $name => $agent){  ?>
    <li><?php echo $name; ?>
        <ul>
            <?php // Loop over the the products for the agent
                  foreach($agent as $item){     
                echo '<li>'.$item.'</li>';
            } 
            ?>
        </ul>
    </li>
    <?php } ?>
</ul>

【讨论】:

  • 如果在 XML 中有一个名为“ProductType”的新元素,我如何在名称 EX:
  • Itemname -ProductType
  • 旁边打印它们
  • 这是刚刚改变还是应该是原始问题的一部分?
  • 我不是说它应该被编辑,我是问这是否改变了?当需求不断变化时,在询问后更改问题可能会浪费人们的时间。
  • 非常感谢您的帮助。实际上xml包含太多元素。 stackoverflow 不允许我发布长代码,所以我可以管理其余部分并发布非常小的要求。我同意你的想法
  • 如果您只是需要它们,请尝试(string)$document-&gt;ProductName.'-'.(string)$document-&gt;ProductType;
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签