Foreach循环按XML元素值分组

时间:2020-02-14 08:22:06

标签: php xml api foreach

我想按代理商分组

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>

问题

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

2 个答案:

答案 0 :(得分:2)

将所有数据收集到数组中,其中键是代理,值是产品数组:

<?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
}?>

答案 1 :(得分: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>