1

我一直在使用这段代码来比较两个值,我得到了完全匹配的项目,唯一的问题是不匹配的项目。

$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 给出了荒谬的结果而不是黄色。

4

2 回答 2

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

于 2012-10-02T13:00:36.990 回答
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"
}
于 2012-10-02T12:58:19.637 回答