2

このコードを使用して2つのphp配列を比較しています。一致するすべてのアイテムを正しく取得しましたが、残念ながら一致しないアイテムを取得できません。これが私のコードです。

<?php 

$filter1 = "blueberries,abc,cornstarch,sugar";
$cval = strtoupper($filter1);         
$parts1 = explode(',',$cval);

$filter2 = "water,blueberries,sugar,cornstarch";
$values = strtoupper($filter2);
$parts2 = explode(',', $values);


$m=0;
$nm=0;


for($i = 0; $i< count($parts1); $i++)
{

for($j = 0; $j< count($parts2); $j++)
{

if($parts1[$i] == $parts2[$j])
{
$m++;
$p[] = $parts1[$i];
}
else{
$nm++;
$q[] = $parts1[$i];
}

}

}

echo $m;
echo "<br />";
echo $nm;
echo "<br />";
print_r($p);
echo "<br />";
print_r($q);

?>

組み込みの配列比較関数を使用したくないので、誰かがこの問題を解決するのを手伝ってくれませんか。

4

4 に答える 4

2

これには内部関数を使用します(あなたの質問を理解していれば)

一致:

$matched = array_intersect($parts1, $parts2);

違い:

$difference = array_diff($parts1, $parts2);

または、for ループの世界では:

<?php
    $filter1 = "blueberries,abc,cornstarch,sugar";
    $cval = strtoupper($filter1);
    $parts1 = explode(',', $cval);

    $filter2 = "water,blueberries,sugar,cornstarch";
    $values = strtoupper($filter2);
    $parts2 = explode(',', $values);

    $matched = $not_matched = array();

    for ($i = 0; $i < count($parts1); $i++)
    {

        if (in_array($parts1[$i], $parts2))
        {
            $matched[] = $parts1[$i];
        }
        else
        {
            $not_matched[] = $parts1[$i];
        }

    }

    print_r($matched);
    print_r($not_matched);
?>

in_array() を使用する代わりに別のループを追加することに取り組んでいますが、2 つの理由から回答を更新しません。

1) 使用

$matched = array_intersect($parts1, $parts2);
$difference = array_diff($parts1, $parts2);

2 行の代わりにこれだけ多くのコードを書くことは、私の宗教に反します。

array_*2)または関数を厳密に使用しないでこの量のコードを作成する唯一の理由はin_array、私が入力して勝ちたいクイズまたはテストのためであるに違いありません。

于 2012-12-06T10:58:14.037 に答える
1
    <?php
    $array1 = array("a" => "green", "red", "blue", "red");
    $array2 = array("b" => "green", "yellow", "red");
    $result = array_diff($array1, $array2);

    print_r($result);
    ?>

これはphpライブラリ関数です。

于 2012-12-06T12:59:51.283 に答える
1

2 つの配列のデカルト積を実行しています。が見つかった場合、 に追加するの$parts1[$i] == $parts2[$j]は正しいですが、逆の仮定 (異なる場合は に追加する) は間違っています。のすべての要素から始めて、一致するものがあれば、 に追加して から削除する必要があります。$parts1[$i]$p$q$q$p$q

于 2012-12-06T11:04:52.390 に答える
1

array_intersect、array_diff、array_merge を使用する

$filter1 = "blueberries,abc,cornstarch,sugar";
$cval = strtoupper($filter1);         
$parts1 = explode(',',$cval);

$filter2 = "water,blueberries,sugar,cornstarch";
$values = strtoupper($filter2);
$parts2 = explode(',', $values);

print_r(array_intersect($parts1, $parts2));

print_r(array_merge(array_diff($parts1, $parts2), array_diff($parts2, $parts1)));

配列 ( [0] => ブルーベリー [2] => コー​​ンスターチ [3] => 砂糖) 配列 ( [0] => ABC [1] => 水 )

于 2012-12-06T11:00:49.853 に答える