私は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 ){
...
}
}
}