2014-02-12 102 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」; } –