Я хочу сгруппировать их по агенту

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>

< Сильный > Проблема

Я должен изменить свой код каждый раз, когда имя агента меняется. Мой код не кажется хорошим решением, когда число агентов увеличивается.

1
troshan 14 Фев 2020 в 11:22

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>
2
Nigel Ren 14 Фев 2020 в 08:30

Соберите все данные в массив, где ключ - агент, а значение - массив продуктов:

<?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
}?>
2
u_mulder 14 Фев 2020 в 10:05