【问题标题】:Grouping and Sorting XML results in PHP在 PHP 中对 XML 结果进行分组和排序
【发布时间】:2017-06-14 21:44:56
【问题描述】:

早上

我正在从一个名为 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>

真正在苦苦挣扎的是 GROUP by SIZE 和 SORT by AVAILABLE DESC

分组 按尺寸 看看 ProductCode 有 XXX/YY/X 吗? YY 是 4 种可能的产品尺寸之一。我得到这个 $size = substr($product->ProductCode, -4, 2);

排序 按可用 DESC

这是我到目前为止设置的 PHP。这正确显示了所有产品,但未按尺寸(12、05、25、50)分组或按可用数量 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>";
}

【问题讨论】:

  • 嗨,正如我在最后一段代码中看到的,您没有对结果进行排序。首先,您需要进行排序、分组或其他任何操作,然后您就可以打印它了。由于您在同一个 foreach 上打印结果,因此您永远不会拥有排序表。问候! :)
  • 您好,感谢您的关注和回复。完全正确-我尝试的组/排序的每次迭代都不起作用。我已经尝试修改这个大约 3 周,并希望通过发布我能在正确的方向上得到推动。我与 grouping 最接近的是一个 switch($size),它通过列出一个大小来工作。但是,一旦我带来任何其他情况:它开始将两种尺寸混合在一起。
  • 我想我误解了你的问题。其实,你的问题是什么?您是尝试排序然后打印表格,还是仅打印 AvailableQty 和 Size 字段时遇到麻烦?
  • 正如你所说,我的问题是成功排序然后打印表格。 GROUP by SIZE 然后SORT GROUP by AVAILABLE DESC
  • GROUP 是什么意思?多张桌子?这感觉就像是先按 Size 排序,然后按 Ava​​ilableQty 排序。请显示所需的结果。有一个不循环的解决方案!此外,XML 中必须有一个根。

标签: php xml sorting


【解决方案1】:

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

类似:

$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,基本上需要两个参数,一个是你的数组,第二个只是一个函数,这个函数会应用条件对你的数组进行排序。

将这些代码放在 foreach 之前:

usort documentation

美好的一天!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多