2012-10-02 45 views
1

我一直在使用這段代碼來比較兩個值,我準確地得到匹配的項目,唯一的問題是與不匹配的項目。PHP數組值和strpos函數

$filter1 = "red,green,blue,yellow";   
$parts1 = explode(',', $filter1); 

$filter2 = "red,green,blue";   
$parts2 = explode(',', $filter2); 

for($i=0; $i< count($parts1); $i++) 
{ 
    for($j=0; $j< count($parts2); $j++) 
    { 
    if(strpos($parts1[$i],$parts2[$j]) !== false) 
    { 
     $match[] = $parts1[$i]; 
    } 
    else 
    { 
     $nomatch[] = $parts2[$j]; 
    } 
    } 
} 

print_r($match); 
echo "<br>"; 
print_r($nomatch); 

什麼我得到的結果是

Array ([0] => red [1] => green [2] => blue) 
Array ([0] => green [1] => blue [2] => red [3] => blue [4] => red [5] => green [6] =>  
red [7] => green [8] => blue) 

陣列1給出確切的匹配值,但陣列2給出荒謬的結果,而不是黃色的。

+0

您是否嘗試過使用'和array_diff() '和'array_intersect()'? – complex857

+0

我不需要使用array_diff或任何其他功能,因爲我不需要精確匹配我想包含像動物和動物一樣的物品。所以這就是爲什麼我使用strpos()函數。 –

+0

然後'array_udiff'和'array_uintersect'是要走的路( - : – complex857

回答

2

在這裏你去:

for($i=0; $i< count($parts1); $i++) 
{ 
    $matched = false; 
    for($j=0; $j< count($parts2); $j++) 
    { 
    if(strpos($parts1[$i],$parts2[$j]) !== false) 
    { 
     $match[] = $parts1[$i]; 
     $matched = true; 
     break; 
    } 
    } 
    if (!$matched) 
    { 
    $nomatch[] = $parts1[$i]; 
    } 
} 

演示:http://codepad.org/J6lmOUVO

+0

謝謝。它的作品 –

+0

我會添加一個休息;行後$匹配=真,不是必要的,但更強大 – abidibo

+0

@abidibo是的,我添加了它。 – PiTheNumber

1

因爲您正在嵌套循環,所以對於外部循環的每次迭代,您都必須迭代內部循環的每個元素。你看到的不匹配的無關值是所有那些額外的內部迭代。

如果你必須允許部分匹配與strpos(),使用以下命令:

foreach ($parts1 as $p) { 
    // Flag that the current value has been matched 
    $matched = FALSE; 
    foreach ($parts2 as $p2) { 
    if (strpos($p, $p2) !== FALSE) { 
     $matches[] = $p; 
     $matched = TRUE; 
    } 
    } 
    // If the loop was proceed with no match, add to non-matches 
    if (!$matched) { 
    $nomatch[] = $p; 
    } 
} 

var_dump($matches); 
array(3) { 
    [0] => 
    string(3) "red" 
    [1] => 
    string(5) "green" 
    [2] => 
    string(4) "blue" 
} 
var_dump($nomatch); 
array(1) { 
    [0] => 
    string(6) "yellow" 
} 
+0

我上面解釋過我不能使用array_dif或者數組相交函數,因爲我不需要完全匹配 –

+0

@ h_a86參見上面的代碼 –