1

私はこのコードを使用して2つの値を比較してきましたが、一致するアイテムを正確に取得しています。唯一の問題は、一致しないアイテムにあります。

$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 に答える