2013-01-07 65 views
1

我無法檢查逗號分隔的字符串是否包含另一個逗號分隔的字符串。檢查逗號分隔的字符串是否包含另一個以逗號分隔的字符串

假設我有兩個字符串

$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon"; 
$stringB="blue,green,white,pink,maroon"; 

所有我想檢查是$stringB顏色是否包含在$stringA與否?我能想到的唯一方法是將$stringA轉換爲數組,然後使用in_array函數逐個檢查顏色。還有更簡單的方法嗎?

在此先感謝

+0

這就是我會做的。拆分成數組並比較數組。 – Kermit

回答

2
$stringA="red,blue,yellow,green,black,grey,purple,pink,khaki,lemon,orange,white,maroon"; 
$stringB="blue,green,white,pink,maroon"; 

$arrayA = explode(',', $stringA); 
$arrayB = explode(',', $stringB); 

$min = min(array(
    count($arrayA), 
    count($arrayB), 
)); 

$AcontainsB = ($min == count(array_intersect($arrayA, $arrayB))); 
+0

解決方案很慢 – lupatus

+0

同意,這不是webscale。 –

2

我覺得比較陣列是不是壞主意,但你也可以做這樣的事情:

$stringATmp = ','.$stringA.','; 
$colors = explode(',', $stringB); 
$contains = true; 
foreach ($colors as $color) { 
    if (strpos($stringATmp, ','.$color.',') === false) { 
     $contains = false; 
     break; 
    } 
} 
1

有一些人比其他人更快地做這件事的方式,但沒有在概念上比將數據加載到某種數據結構更容易。由於您正在討論以任意順序檢查項目列表與另一個可以任意順序的項目列表,因此沒有將參考列表(stringA)放入數據結構的快捷方式,然後查找stringB列表那個數據結構。

加速它的一種方法。

  1. 將stringA分解爲一個數組。
  2. 數組翻轉字符串A數組,以便顏色成爲數組中的鍵(值無關緊要)。
  3. 現在,你可以通過查找從分解串B每種顏色有類似下面的代碼:

事情是這樣的:


$stringAArray = explode(',', $stringA); 
$stringAArray = array_flip($stringAArray); 
$stringBArray = explode(',',$stringB); 
$itemsToFind = count($stringBArray); 
foreach ($stringBArray as $colorFromB) { 
    if (array_key_exists($colorFromB, $stringAArray)) { 
     $itemsToFind--; 
    } 
} 
if ($itemsToFind == 0) { 
    echo "All B items are in A" 
} 

這是一個非常快查找和適合A和B中的大量項目。

最後說明:對於小型數組,它通過in_array將會比較快。

+0

順便說一句,我認爲@ dev-null-dweller的解決方案特別優雅。我的規模可能會更好,但作爲如何爲您所用的大小的數組執行此操作的範例,您無法擊敗dev-null-dweller的簡單和優雅的方法。 – DWright

+0

@lupatus:感謝您對foreach的更正編輯。你是對的。您的編輯在我有機會批准之前被拒絕,我不知道爲什麼。謝謝! – DWright