1

我最近(两周前)开始用 PHP 编码,今天我遇到了一个问题,想知道是否有人可以帮助/指导我。

我正在从 Web 服务获取 xml 数据,并希望如下图所示呈现数据

在此处输入图像描述

获取的 XML 如下所示

 <pricesheets>
<pricesheet>            
    <buyinggroupname>China</buyinggroupname>
    <categoryname>Category B</categoryname>
    <currency>USD</currency>
    <discamt>39330.00</discamt>
    <productdesc>Product B description</productdesc>
    <prdouctId> Product B </productId>
</pricesheet>
<pricesheet>            
    <buyinggroupname>Asia</buyinggroupname>
    <categoryname>Category A</categoryname>
    <currency>USD</currency>
    <discamt>39330.00</discamt>
    <productdesc>Product A description</productdesc>
    <prodouctId> Product A </productId>
</pricesheet>   
</pricesheets>

我遇到的问题是在 XML 之上解析的最佳方法是什么,以便我可以根据“buyinggroupname”和“categoryname”呈现产品。一旦我知道如何呈现数据,我就可以轻松完成折叠和展开功能。

以下是我为实现我想要的目标所做的事情。但我确信我的代码不是高效且可扩展的。

$xmldata;  // XML return by the webservice
$data = simplexml_load_string($xmldata);
$category_A_items = '';
$category_B_items = '';
foreach ($data as $object) {
  if($object->categoryname == 'Category A') { // Bad Idea : Hard coded category
      $category_A_items .= '<tr><td>'.$object->prdouctId.'</td><td>'. $object->productdesc. '</td><td>'. $object->discamt. '</td></tr>';
    }
  elseif($object->CATEGORYNAME == 'Category B') { // Bad Idea : Hard coded category
        $category_B_items .='<tr><td>'.$object->prdouctId. '</td><td>'. $object->productdesc. '</td><td>'. $object->discamt. '</td></tr>';                      
    }
}
//Render Category A items in table
 if(strlen($category_A_items) > 0) {
      echo '<h3>CAD</h3>';
      echo '<table><tr><th>Product Name</th><th>Description</th><th>Price</th></tr>';
      echo $cadItems;
      echo '</table>'. PHP_EOL;
  }
  //Render Category B items in table
  if(strlen($category_B_items) > 0) {
      echo '<h3>Breast Biopsy</h3>';
      echo '<table><tr><th>Product Name</th><th>Description</th><th>Price</th></tr>';
      echo $breastBiopsy;
      echo '</table>'. PHP_EOL;
  }

上面的代码仅根据类别(硬编码)呈现数据。现在有什么更好的方法来做同样的事情,这样我就可以根据“buyingroupname”和“categoryname”呈现数据,而无需在php代码中对这两个值中的任何一个进行硬编码。

提前致谢!

4

2 回答 2

1

使用 xpath获取一组唯一的<categoryname>-nodes,然后遍历它并选择<pricesheet>具有该特定类别的所有 -nodes,让 xpath 再次完成该工作:

$xml = simplexml_load_string($x);
$cat = array_unique($xml->xpath("//categoryname"));

foreach ($cat as $c) {
    echo "$c<br />";
    foreach ($xml->xpath("//pricesheet[categoryname='$c']") as $p) {
        echo $p->productId."<br />";
    }
}

观看现场演示 @ http://codepad.viper-7.com/m9ruRU

当然,您必须添加用于创建表的代码...

于 2013-04-03T22:56:41.820 回答
0

将字符串放入带有可变键的数组中,让 PHP 可以为您整理好它们,而且您根本不需要知道任何类别名称。我使用了多维数组,这样每个buyingroup 里面都有自己的类别。然后循环遍历数组以制作每个表。如果您需要更多解释,请告诉我。我第一次看到你的图片时误解了它。

$xmldata;  // XML return by the webservice
$data = simplexml_load_string($xmldata);
$buyinggroups = array();
foreach ($data as $object) {
    if(isset($object->buyinggroupname) || isset($object->BUYINGGROUPNAME)) {
        if(isset($object->buyinggroupname)) {
            $name = $object->buyinggroupname;
        } else {
            $name = $object->BUYINGGROUPNAME;
        }
    }
    if(isset($object->categoryname) || isset($object->CATEGORYNAME)) {
        if(isset($object->categoryname)) {
            $category = $object->categoryname;
        } else {
            $category = $object->CATEGORYNAME;
        }
    }
    if(isset($category) && isset($name)) { //just making sure this row is OK
        if(!isset($buyinggroups[$name])) {
            $buyinggroups[$name] = array();  //initialize the outer array
        }
        if(!isset($buyinggroups[$name][$category])) {
            $buyinggroups[$name][$category] = '';  //this is like your previous $category_A_items
        }
        $buyinggroups[$name][$category] .= '<tr><td>'.$object->productId.'</td><td>'. $object->productdesc. '</td><td>'. $object->discamt. '</td></tr>';
    }
}


//Render all categories in lots of tables
//I am guessing at what HTML you want here; I don't think it's necessarily correct
echo '<table>'. PHP_EOL;
foreach($buyinggroups as $name=>$set) {
    echo '<tr><th colspan="2">'.$name.'</th></tr>'. PHP_EOL;
    echo '<tr><th> </th><td>';
    foreach($set as $category=>$rows) {
        echo '<table>'; 
        echo '<tr><th><h3>'.$category.'</h3></th>'. PHP_EOL;
        echo '<td><table><tr><th>Product Name</th><th>Description</th><th>Price</th></tr>';
        echo $rows;
        echo '</table>'. PHP_EOL;
    }
    echo '</td></tr>';
}
echo '</table>';

编辑:

这不可能超出您的调试能力。您将获得调试所需的一切。PHP 会告诉您行号和错误。你用谷歌搜索错误并找出它的含义。然后你转到那个行号,看看那里的内容与你用谷歌搜索的内容是如何对应的。在这种情况下,我可以告诉你“非法偏移类型”意味着你有一个不是字符串或整数的数组键。在错误消息的这些行中,您有数组键 $name 和 $category。尝试使用 var_dump($name) 和 var_dump($category) 来找出它们实际上是什么,甚至尝试使用 var_dump($object) 来找出如何从对象中获取名称和类别。

于 2013-04-03T22:51:08.073 回答