在PHP中对XML进行分组和排序

时间:2017-01-29 17:44:19

标签: php xml sorting

上午

我从一些名为UNLEASHED的软件中提取StockOnHand查询。

这是XML的一个示例。

<StockOnHand>
  <ProductCode>FL1/35/C</ProductCode>
  <ProductDescription>350ml Flavour 1</ProductDescription>
  <ProductGroupName>Edible</ProductGroupName>
  <AllocatedQty>200.0000</AllocatedQty>
  <AvailableQty>8254.0000</AvailableQty>
  <QtyOnHand>8454.0000</QtyOnHand>
</StockOnHand>


<StockOnHand>
  <ProductCode>FL1/65/C</ProductCode>
  <ProductDescription>650ml Flavour 1</ProductDescription>
  <ProductGroupName>Edible</ProductGroupName>
  <AllocatedQty>2.0000</AllocatedQty>
  <AvailableQty>86.0000</AvailableQty>
  <QtyOnHand>88.0000</QtyOnHand>
</StockOnHand>

GROUPING 按尺寸 了解ProductCode如何拥有XXX / YY / X? YY是4种可能的产品尺寸之一。我明白这个     $ size = substr($ product-&gt; ProductCode,-4,2);

分拣 可用DESC

这是我到目前为止设置的PHP。这正确显示了所有产品,但未按大小分组(12,05,25,50)或按AvailableQty DESC排序

function atUnit15()
{
    echo "<h2>Qty @ Unit 15</h2>";
    $prodXml = getProducts('warehouseCode=UNIT-15');

    echo "<table border='1'> 
                <tr> 
                    <th>Code</th>
                    <th>Description</th>
                    <th>Days since last sale</th>
                    <th>OnHand</th>
                    <th>On Orders</th>
                    <th>Available</th> 

                </tr>  
    <tbody>";

    foreach ($prodXml->StockOnHand as $product) {
        switch ($product->ProductGroupName) {
            case 'Ice Cream':
                $size = substr($product->ProductCode, -4, 2);
                $code = $product->ProductCode;
                $desc = $product->ProductDescription;
                $saledays = $product->DaysSinceLastSale;
                $onHand = floor($product->QtyOnHand);
                $allocated = floor($product->AllocatedQty);
                $available = floor($product->AvailableQty);
                echo "<tr>
        <td>$code</td>
        <td> $desc</td>
         <td> $saledays</td>
        <td> $onHand</td>
        <td> $allocated</td>
        <td> $available</td>
        </tr>";
            default:
                break;
        }
    }
    echo "</tbody>";
    echo "</table>";
}

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案是使用自定义排序功能:

类似的东西:

$stockOnHand = $prodXml->xpath('/root/StockOnHand');
usort($stockOnHand, function ($t1, $t2) {
    return substr($t1->ProductCode, -4, 2) > substr($t2->ProductCode, -4, 2);
});
  1. 使用XPath函数检索所有StockOnHand,在我的情况下,root节点包装了所有StockOnHand

  2. 使用usort,基本上需要两个参数,一个是你的数组,第二个只是一个函数,这个函数将应用条件对你的数组进行排序。

  3. 将这些代码放在foreach之前:

    usort documentation

    美好的一天!