【问题标题】:PHP / simpleXML - Preventing duplicate XML values from being inserted into an arrayPHP / simpleXML - 防止重复的 XML 值被插入到数组中
【发布时间】:2014-02-12 13:01:54
【问题描述】:

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

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

所以我创建了 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>

【问题讨论】:

  • erm 只是在添加之前检查数组是否已经包含它??

标签: php xml simplexml


【解决方案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 中的数组可以同时进行数字索引和关联。

我也在想一个更优雅的方法来完成这个,这只是我的头上的答案。将根据需要进行编辑。

【讨论】:

  • 这行得通,尽管与其他 (in_array) 技术相比,它的优势在于您不需要在添加它之前进行检查。 IE。不需要if(!isset...
  • 另外值得注意的是,如果您想在数组中存储的不仅仅是名称,则此技术将起作用。
  • @RobBaillie,我对 in_array() 的问题是效率。我相信检查一个键 O(n) 比检查整个数组的值要便宜。
  • 我认为该声明是基于对 PHP 如何实现 in_array 的深入理解;-) 这似乎很公平 - 您应该注意,我没有声明我对您的方法有任何反对,这是完全合理的。但是,不需要检查。您可以每次都覆盖该值。可能会更慢,可能会更快 - 如果您关心该级别的性能,可能应该进行基准测试。在这些情况下,您可能还需要考虑内存使用和 key->value 相同的数据重复。
  • @RobBaillie 兄弟,一切都很好。当我在大学攻读 CS 时,表现就像上帝一样,所以它一直伴随着我。
【解决方案2】:

您可以重新组织 $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>";
 }

这样做意味着数组保持数字索引(这可能很重要,也可能不重要)。

【讨论】:

  • 关于被数字索引的结果,您可以在完全填充后丢弃键,并调用array_valuesin_array 必须遍历所有值,因此扩展性很差。
  • 谢谢!您建议的 in_array 代码应该可以工作,但是它不能防止将重复值放入数组中。但是,此代码有效: $practiceArray = array('Product1', 'Product2', 'Product3'); echo "在数组测试器中 --
    "; if (in_array("Product1", $practiceArray)) { echo "在数组中"; } else { echo "不在数组中"; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多