2012-10-02 46 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参见上面的代码 –