PHP / simpleXML - 防止将重复的XML值插入到数组中

时间:2014-02-12 13:01:55

标签: php xml simplexml

以下代码成功检索并显示XML文件中的名称和价格元素。

我还希望显示XML“store”值的文本,但不希望显示任何重复的商店名称。

所以我创建了storeArray来保存商店的名称,但不知道如何防止重复的商店名称被插入到数组中。

在下面的代码中,“Best Buy”显示两次(使用第二个foreach循环时),但我只希望它显示一次。

有没有办法在storeArray中插入商店的名称,还能防止插入重复的商店名称?

或者,有没有比下面的代码更好的方法呢?

 $xmlDoc = simplexml_load_file("products.xml");
 $storeArray = array();
 foreach($xmlDoc->product as $Product) {
   echo "Name: " . $Product->name . ", ";
   echo "Price: " . $Product->price . ", ";

   $storeArray[] =  $Product->store;
   echo "<br>";
 }

 foreach ($storeArray as $store) {
   echo $store . "<br>";
 }

XML文件:

<products>

  <product type="Electronics">
    <name> Desktop</name>
    <price>499.99</price>
    <store>Best Buy</store>
  </product>

  <product type="Electronics">
    <name>Lap top</name>
    <price>599.99</price>
    <store>Best Buy</store>
  </product>

  <product type="Hardware">
    <name>Hand Saw</name>
    <price>99.99</price>
    <store>Lowes</store>
  </product>

</products>

2 个答案:

答案 0 :(得分:1)

您拥有的一个选项是利用关联数组键始终是唯一的这一事实。您可以使用元素或属性名称作为键,使用isset()数组函数来查看该键是否存在。例如:

 $xmlDoc = simplexml_load_file("products.xml");
 $storeArray = array();
 foreach($xmlDoc->product as $Product) {
     echo "Name: " . $Product->name . ", ";
     echo "Price: " . $Product->price . ", ";

     if(!isset($storeArray[$Product->store])
     $storeArray[$Product->store] =  $Product->store;

     echo "<br>";
 }

 foreach ($storeArray as $store) {
     echo $store . "<br>";
 }

PHP中的数组可以同时进行数字索引和关联。

我也试图想出一种更优雅的方式来实现这一目标,这只是我头脑中的答案。将根据需要进行编辑。

答案 1 :(得分:0)

您可以重新组织$storeArray的定义方式,如另一个答案中所述,但也值得考虑“in_array”。此检查是值已在数组中:

$xmlDoc = simplexml_load_file("products.xml");
$storeArray = array();
foreach($xmlDoc->product as $Product) {
   echo "Name: " . $Product->name . ", ";
   echo "Price: " . $Product->price . ", ";

   if( !in_array( $Product->store, $storeArray ) {
      $storeArray[] =  $Product->store;
   }
   echo "<br>";
 }

 foreach ($storeArray as $store) {
   echo $store . "<br>";
 }

这样做意味着数组仍然以数字方式编入索引(这可能重要也可能不重要)。