2014-04-11 65 views
0

我的理解是,使用isset來防止將重複值插入到數組中是關於內存消耗,資源使用情況和代碼處理簡便性的最佳方法。我目前使用的array_count_values,像這樣:PHP - 使用isset來防止數組中的重複值

$XMLproducts = simplexml_load_file("products.xml"); 
foreach($XMLproducts->product as $Product) { 
if (condition exists) { 
$storeArray[] = (string)$Product->store; //potentially several more arrays will have values stored in them 
}} 

$storeUniques = array_count_values($storeArray) 
foreach ($storeUniques as $stores => $amts) { 
?> 
<a href="webpage.php?Keyword=<?php echo $keyword; ?>&features=<?php echo $Features; ?>&store=<?php echo $stores; ?>"> <?php echo $stores; ?> </a> <?php echo "(" . ($amts) . ")" . "<br>"; 
} 

將如何防止被插入到一個數組(類似於以上)使用ISSET重複值?如果被解析的XML文件非常大(5-6MB),那麼2之間是否存在巨大的性能差異?

+3

爲什麼不使用'array_unique'? – Anthony

+0

我聽說array_unique和array_count_values在內存消耗,資源使用和代碼處理的簡易性方面相當「不友好」。如果沒有顯着的性能差距,我肯定會使用array_unique或array_count_values –

回答

1

由於您在輸出中使用計數,因此您不能使用array_unique(),因爲您會丟失該信息。

你可以做什麼,是建立在您的循環所需要的陣列,使用字符串作爲你的鑰匙和計數的值,當您去:

$storeArray = array(); 
foreach($XMLproducts->product as $Product) { 
    if (condition exists) { 
    $store = (string)$Product->store; 
    if (array_key_exists($store, $storeArray)) 
    { 
     $storeArray[$store]++; 
    } 
    else 
    { 
     $storeArray[$store] = 1; 
    } 
    } 
} 

請注意,這只是爲了說明這一點,你可以可能將其包裝在一行中。

這樣你就不會在你的數組中有多個重複的字符串(假設這是你關心的問題),並且不會通過生成第二個(可能很大的)數組來增加內存消耗。

+0

順便說一句,我使用'array_key_exists()',但是你可以很容易地使用'isset()'。 – jeroen

+0

一般來說,使用array_count_values方法會從最終用戶的角度以顯着的方式對性能產生負面影響。我們正在通過解析一個大的XML文件(大5+ MB)將值插入數組中! –

+0

@DeanOlsen你必須測量一下,但請記住,你正在生成一個全新的數組,所以如果原始數組很大,副本會更小,但是需要內存和時間來處理它。順便說一下,從這個意義上說,XML文件的大小是不相關的,重要的是數組的大小。 – jeroen

1

我認爲array_unique和公司被認爲是不友好的,因爲他們每次檢查數據庫時都會檢查數據庫。你要寫的代碼基本上是一樣的,所以我沒有看到使用array_unique的問題。

0

很簡單,不需要檢查:

foreach($XMLproducts->product as $Product) 
    $helperArray[$product->store] = ""; 

關聯數組必須定義唯一的密鑰。如果一個密鑰已經存在,它就被覆蓋。
現掉換鍵和值:

$storeArray = array_keys($helperArray); 

編輯:也算每個<store>的出現次數的數量,我建議:

foreach($XMLproducts->product as $Product) 
    $helperArray[] = (string)$product->store; 

然後:

$storeArray = array_count_values($helperArray); 

結果:key =唯一商店,value = count。