Aの集合とBの集合それぞれで突き合わせて条件分岐したい場合、みなさんはどのようなロジックを組みますか?

最初に考えつくコードは以下のようになるかと思う。

foreach ($array_a as $param_a) {
    foreach ($array_b as $param_b) {
        if ($param_a->checkCode == $param_b->checkCode) {
            echo 'checkCode exist in b';
        }
    }
}

しかし、このコードの場合、処理が2重になっていることが問題である。

このコードで処理される量はcount(A)*count(B)になる。

数が少ない場合は対して問題はない。

しかし、AとB両方100件のデータを持っていたら10000回、1000件のデータを持っていたら1000000回と増えるほど膨大になっていく。

もし、この中でDBに接続することがあったら悲惨なことになる。

この問題を踏まえて、最近は以下のように最初にデータ整形してから書くようになった。

$targetArray = [];
foreach ($array_b as $param_b) {
    $targetArray[] = $param_b->checkCode;
}

foreach ($array_a as $param_a) {
    if (in_array($param_a->checkCode , $targetArray)) {
        echo 'checkCode exist in b';
    }
}

 

$targetArray = [];
foreach ($array_b as $param_b) {
    $targetArray[$param_b->checkCode] = [
        'info_a' => $param_b->info_a,
        'info_b' => $param_b->info_b
    ];
}

foreach ($array_a as $param_a) {
    if (array_key_exists($param_a->checkCode , $targetArray)) {
        echo 'param_a can use info_a and info_b';
    }
}

片方のデータを配列にいれるか、連想配列のキーに設定して、もう片方のデータをforeachで回して存在チェックをする。

こうすることで処理の量は加算になり、AB両方が1000件のデータを持っていても2000件しか処理がされず、1000000回からかなり処理量を減らすことができる。

これによりメモリは少し食われるが、処理時間はだいぶ節約することができタイムアウト対策なんかになる。

カテゴリー: その他もろもろ

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。