0

私は2つの大きな2次元配列(いくつかのxmlデータから引き出されたもの)を持っています.1つ( Aリスト)は5つのフィールドを含む〜1000項目で、もう1つ( Bリスト)は動的に5つのフィールドを含む10.000-12.000項目です。

私の考えは、リストAの各IDキーをリストBの各IDキーと比較し、「true」で結合されたフィールドの新しい配列を作成するか、一致しない場合は配列Aのフィールドだけを作成することでした。

ネストされた foreach ループを使用した結果、処理に時間がかかる何百万もの反復が発生しました。言うまでもなく...解決策ではありません。

この 2 つの構造の形式と必要な結果は、すぐに SQL 結合を思い出させました。

質問は次のとおりです。1.) SQL を試す必要がありますか、それともネストされた foreach が最適な php の方法ではない可能性がありますか? 2.) リレーショナル クエリは反復よりもはるかに高速ですか?

編集:

ノードごとに10以上のフィールドを含むxmlファイルから(別のプロセスで)定期的にのみデータを取得します。必要な 5 つのフィールドを CSV ファイルに保存して、後で mysql データベースから取り出したテーブル A と比較します。基本的に、新鮮なフィードによる属性のカタログ更新によく似ています。CSV に保存するという当初の考えは間違いでした。フィードの更新もデータベースに保存する必要があります。

編集2

配列リスト B は次のようになります

Array
(
    [0] => Array
        (
            [code] => HTS541010A9E680
            [name] => HDD Mobile HGST Travelstar 5K100 (2.5", 1TB, 8MB, SATA III-600)
            [price] => 385.21
            [avail] => 0
            [retail] => asbis
        )
...
...

Aリストは、比較に役立つ唯一の「コード」フィールドを除いてすべて類似しています

Array
    (
        [0] => Array
            (
                [code] => ASD-HTS541010A
                [name] => HDD Mobile HGST Travelstar 5K100 (2.5", 1TB, 8MB, SATA III-600)
                [price] => 385.21
                [avail] => 0
                [retail] => asbis
            )

ご覧のとおり、各フィードにはユニバーサルコードがありますが、プレフィックスまたはサフィックスとしていくつかの異なるランダムデータがあるため、各ループで文字列に対していくつかの操作を実行してストリップするか、一致または近似一致のフィード ID と比較する必要があります。

擬似コード:

$mylist = loadfromDB();
$whslist = loadfromCSV();

        foreach ($mylist as $myl) {
                foreach ($whslist as $whl){


                    if ((stripos(code_a,code_b) OR (code_b,code_a) !== false)){
                                        ...
                    }
                    elseif (stripos(substr(strstr(code_a,'-'),1),code_b) !== false) {
                        ...
                    }
                    elseif (stripos( substr(code_a,0,-5);) == !false ){
                        ...
                    }




                    }


            }
4

1 に答える 1

1

ほとんどの SQL エンジンは結合用に最適化されており、メソッドはブルート フォース メソッドであるため、SQL を使用すると高速になります。ただし、そのすべてのデータを MySQL テーブルに挿入するのはかなりの負荷がかかるため、最善の解決策とは言えません。

PHP で結合することをお勧めしますが、よりスマートなアルゴリズムを使用してください。まず、一致させたいフィールドで 2 つの配列を並べ替えます。a並べ替えられた両方の配列を一緒に反復処理します - 2 つのイテレータ (またはポインタやインデックスなど) を使用します - 何度も繰り返すAbしましょうBaループの反復ごとに、とが指す要素の比較フィールドを比較しますba小さい場合- 進めaます。b小さい場合- 進めbます。aが と等しい場合b- 新しいリストに格納する必要がある一致があります。次に、 と の両方aを進めますb(関係が 1 対 1 であると仮定します。1 対多の場合は、たくさんの多対多の場合は、もう少し複雑なソリューションが必要です)。

于 2013-11-12T01:51:27.367 に答える