2014-02-12 66 views
0

以下代码成功检索并显示XML文件中的名称和价格元素。PHP/simpleXML - 防止将重复的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> 
+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中的数组可以同时用数字索引和关联。

我也试图想到一个更优雅的方式来实现这一点,这只是我头顶答案。将根据需要进行编辑。

+0

这可以起作用,虽然这比其他(in_array)技术的好处是你不需要在添加它之前检查。 I.E. 'if(!isset ...'is not need。 –

+0

另外值得注意的是,如果你想在数组中存储更多的名字,这种技术将会起作用 –

+0

@RobBaillie,in_array()的问题是效率。我相信检查一个关键字O(n)比检查整个数组的值更便宜 – Zarathuztra

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>"; 
} 

这样做,这样意味着该阵列保持数字索引(这可能是或可能不是很重要)。

+1

关于数字索引的结果,您可以在调用'array_values'完全填充密钥后丢弃这些密钥。 'in_array'必须遍历所有的值,因此缩放非常差。 – IMSoP

+0

谢谢!你建议的in_array代码应该可以工作,但是它不会阻止将重复值放入数组中。但是,这段代码有效:$ practiceArray = array('Product1','Product2','Product3'); echo“In Array tester -
”; (in_array(“Product1”,$ practiceArray)){ echo“Is in array”;如果(in_array(“Product1”,$ practiceArray)){ } else { echo“NOT in array”; } –