2011-07-06 85 views
3

我正在比較兩個逗號分隔的字符串並完全刪除重複項。也就是說,如果兩個字符串中都存在項目,則結果中將不存在該項目。從兩個逗號分隔的字符串中刪除重複項

例如,比較cat,dog,alligatoralligator,parakeet的結果將是cat,dog,parakeet

我正在使用的解決方案涉及將字符串轉換爲數組進行比較。

$result = array_merge(array_diff($old, $new), array_diff($new, $old)); 

以上的作品,但我想知道如果有一個更有效的方法(正則表達式,字符串比較)做比較,而不將字符串第一個數組。或者,上述解決方案的性能問題真的沒那麼糟糕?

感謝

+1

陣列中有多少個元素? – TheHorse

+0

如何將字符串轉換爲數組? – hakre

+0

回覆:TheHorse。此刻,繩子永遠不會超過少數物品。但是,我認爲這是一種思維練習,所以我很好奇如何處理這樣的事情,如果有大量的項目。 – jbarreiros

回答

0

對於大數量的元素很好的解決方案是:

<?php 
    $temp = sort(array_merge($old, $new)); /* n*log(n); */ 
    $res = array(); 
    for ($i = 0; $i < count($temp); $i++) 
    { 
    if ((count($res) == 0) || ($res[count($res) - 1] !== $temp[$i])) 
     $res.append($temp[$i]); 
    } 
?> 

附:你可以優化。

+1

感謝您的回覆,但代碼並未完全刪除重複項。它確實確保每個項目只出現一次,但我正在尋找重複從兩個字符串中完全刪除。 – jbarreiros

1

有趣的問題。或者,有正則表達式可以完成這項工作。但是在這種情況下數組要快得多。爲了最大限度地減少函數調用,你可以這樣寫:

$str1 = "cat,dog,alligator"; 
$str2 = "alligator,parakeet"; 

$result = array_unique((array) explode(',', $str1 . ',' . $str2)); 
+2

感謝您的回覆。 array_unique方法不能在這種情況下使用,因爲它只是刪除「額外」。我正在尋找要完全移除的物品>>「貓,狗,樹」+「狗,人行道」=「貓,樹,人行道」(注意「狗」是如何完全移除的)。 – jbarreiros

+0

這確實符合OP規範。此外,雖然正則表達式*可以做到這一點,但我非常懷疑這是一種更高效的方法。 –

+0

你是對的!抱歉。我錯過了這個重要的細節。 – jgendera

1

你可以看看Set Math。在你的情況下,你希望聯合減去交叉點(即對稱差異)。

例如:

$result = array_diff(array_merge($s1, $s2), array_intersection($s1, $s2)); 

雖然你可以遍歷每個項目,並執行自己(比如從TheHorse答案),到最後,我相信PHP的本機陣列功能是要在邏輯更高性能,並提供更多的靈活性(例如多套)。

就是說,你的解決方案的工作原理是對稱差異的PHP等價表示。那麼爲什麼改變它...

+0

謝謝傑森。你,jgendera和Chriszuma提到了我最終想知道的事情:如果首先將字符串轉換爲數組的速度比正則表達式或字符串比較快。 – jbarreiros

+0

*小*字符串可能會更快。但是正如所指出的那樣,原生的PHP函數更強大,甚至可能更高性能。 –

2

陣列操作肯定會有足夠的效率,除非你試圖從百萬計算中擠出幾秒鐘。你的解決方案是最簡單的,並且表現非常好,所以最好。

相關問題