2016-05-16 17 views
0

さまざまなWebサイトから多数のXML/CSVファイルをループするPHPスクリプトがあります。今、我々は良いXML/CSVパーサスクリプトを構築することができます。PHP:配列/ stringbuilerなどをループする最速の方法

私たちが書いたPHPスクリプトは、いくつかのBIG XMLまたはCSVファイルをループしています。これらのXMLまたはCVSファイルには、異なる製品のバーコードが含まれています。今

スクリプトは、私はこのようなMySQLのからのプロダクトID +バーコードで配列を埋める開始する前に:

function Barcodes_Array() { 

    $sql = "SELECT ProductId, Barcode FROM Products WHERE (Barcode <> '') "; 

    $res = mysql_query($sql); 

    while ($rijen = mysql_fetch_assoc($res)) {  
     $GLOBALS['arrBarcodes'][] = $rijen; 
    } 

    } 

たびXML(またはCSV)を介して、我々ループ我々がいるかどうかを確認する必要があるファイルは、バーコードが配列内に存在し、プロダクトIDが返されます。関数内で検索するための

$のProductId = SearchBarcodeProduct($ EanNr、 'バーコード');それは永遠に私たちはMySQLの製品表を尋ねる各時間がかかったので、私たちは、アレイに記入

function SearchBarcodeProduct($elem, $field) 
{ 
    $top = sizeof($GLOBALS['arrBarcodes']) - 1; 
    $bottom = 0; 

    $ProductId = 0; 

    while($bottom <= $top) 
    { 
     if($GLOBALS['arrBarcodes'][$bottom][$field] == $elem) {   
      return $GLOBALS['arrBarcodes'][$bottom]['ProductId']; 
     } 
     else { 

      if (is_array($GLOBALS['arrBarcodes'][$bottom][$field])) { 
       if (in_multiarray($elem, ($GLOBALS['arrBarcodes'][$bottom][$field]))) { 
        return $GLOBALS['arrBarcodes'][$bottom]['ProductId']; 
       } 
      } 

     } 

     $bottom++; 
    }   

    return $ProductId; 
} 

そして、まだ機能。

私の質問は以下のようになります。

それはまだバーコードの配列をループするたびに非常に長い時間がかかります。他のソリューションの場合は、配列とは異なる方法かもしれませんか? 誰かが私がこの愚かなことで何週間も働いているのを助けることができますか:)事!

+3

このように –

+0

のように '$ GLOBALS'を使うのは悪い習慣です。検索したい複数のバーコードのリストを作成し、それらのすべてを一度に検索する特定のサイズに達すると考えましたか?これは、毎回新しいクエリを実行するオーバーヘッドを避けることができますが、MySQLのインデックスのメリットはあります。 – Chris

+0

最初にロードされたときに検索配列をソートし、次にその上で対数検索を実行する方法を調べることをお勧めします。 (実際には、クエリに 'ORDER BY barcode'を追加するだけでソート部分を行うことができます) – Uueerdo

答えて

0

なぜ2つの機能が必要ですか?

function itemProduct($barcode) { 
    $sql = "SELECT ProductId, Barcode FROM Products WHERE Barcode = $barcode "; 
    $res = mysql_query($sql); 

    if ($row = mysql_fetch_assoc($res)) {  
     return $row['ProductId']; 
    } else { 
     return 0; 
    } 
} 
+0

ProductIDを探しません!私たちは常にユニバーサルなバーコードを探します;) – Faith

+0

check update。私はまだ2つの機能が必要な理由を得ることができません。 – Alex

+0

最初の関数は配列を塗りつぶすため、スクリプトは配列内で検索され、データベーステーブルに対して150.000回は検索されません。 – Faith

0

あなたBarcode列にインデックスが欠落しているような音:あなたは別の関数を作成することができますバーコードで検索する必要がある場合

は更新ちょうど1

function itemBarcode($id) { 
    $id = intval($id); 
    $sql = "SELECT ProductId, Barcode FROM Products WHERE ProductId = $id Barcode <> '') "; 

    $res = mysql_query($sql); 

    if ($row = mysql_fetch_assoc($res)) {  
     return $row['barcode']; 
    } else { 
     return 0; 
    } 
} 

をお試しくださいおそらくユニークな単一のインデックス付き列を使用して単一の行のルックアップは慌てて速くなければなりません。

単にその後
CREATE INDEX Barcode_Index ON Products (Barcode) 

SELECT ProductId FROM Products WHERE Barcode = *INPUT* 

あなたは、彼らが現在=バーコードをnullの場合はこれらの2つ以上が存在する場合にも、「」インデックスがUNIQUE作ることができます。

while ($rijen = mysql_fetch_assoc($res)) {  
    $GLOBALS['arrBarcodes'][$rijen['Barcode']] = $rijen; 
} 

あるいは単に:

while ($rijen = mysql_fetch_assoc($res)) {  
    $GLOBALS['arrBarcodes'][$rijen['Barcode']] = $rijen['ProductId']; 
} 

は、その後、あなたがまっすぐに見てまで行うことができます。

$ProductId = isset($GLOBALS['arrBarcodes'][$Barcode]) 
    ?$GLOBALS['arrBarcodes'][$Barcode]['ProductId'] 
    :0; 

別のオプションを使用すると、バーコードを持つ配列キーイングされますまたは:

$ProductId = isset($GLOBALS['arrBarcodes'][$Barcode]) 
    ?$GLOBALS['arrBarcodes'][$Barcode] 
    :0; 

N.B$GLOBALSmysql_queryの使用に関するコメントの警告をお読みください。

  • 必要に応じて、バーコード配列をオブジェクトまたは変数に格納します。
  • PDOは非常に便利です。また、取り出した配列をキーとしてフェッチすることもできます。
+0

両方の方法を試してみましたが、MySQLの検索結果が配列検索より多くの行を検索しました: ** while($ rijen = mysql_fetch_assoc($ res)){ $ GLOBALS ['arrBarcodes'] [$ rijen ['Barcode']] = $ rijen ['ProductId']; } ** – Faith

+0

申し訳ありませんが、私はあなたが意味するものを理解していない..私はバーコードがデータベーステーブル内で一意でなければならないと思った。何が問題ですか?これらのオプションはどちらも速くなければならず、特にメモリー内のキー配列が必要です。 – Arth

+0

ちょうど私が言うように。私はすでにIndexを持つBarcode列を持っていました。 Productsテーブルのバーコードを検索すると、$ ProductId = isset($ GLOBALS ['arrBarcodes'] [$ Barcode])?$ GLOBALS ['arrBarcodes'] [$ Barcode] ['ProductId ']:0; ***配列内のバーコードを検索するとき*** – Faith

関連する問題