0

私は次の形式の巨大なPHP配列を持っています:

Array
(
    [0] => ('A', 'B', 'C', 'D', 'E', 'F')
    [1] => ('G', 'H', 'I', 'J', 'K', 'L')
    [2] => ('M', 'N', 'O', 'P', 'Q', 'R')
    ....
    [30000] => ('S', 'T', 'U', 'V', 'W', 'X')
)

ご覧のとおり、私の配列には30,000個のエントリが含まれています。implode()関数を使用して、配列を次の形式の文字列に変換しようとしています。

$values = ('A', 'B', 'C', 'D', 'E', 'F'), ('G', 'H', 'I', 'J', 'K', 'L'), ('M', 'N', 'O', 'P', 'Q', 'R'), ('S', 'T', 'U', 'V', 'W', 'X')

MySQLINSERTクエリを実行できるようにするため。つまり、次のように、30,000個のエントリをデータベーステーブルに一度に(ループなどで実行せずに)挿入しようとしています。

INSERT INTO table_name VALUES $values; 

私が抱えている問題は、implode関数が私の巨大な配列を内破していないように見えることです。文字列をデバッグして配列が展開されているかどうかを確認しようとすると、空の文字列などが表示されます。

誰かが私がこれを修正する方法を知っていますか、またはこれを行うためのより良い方法がありますか?繰り返しになりますが、データベースに30,000回クエリを実行するのではなく、一度に挿入を実行したいだけです。

ありがとうございました

4

6 に答える 6

3

implode多次元配列では機能しません。各インデックスの値は、文字列として解釈されるように二重引用符で囲む必要があります。

Array
(
    [0] => "('A', 'B', 'C', 'D', 'E', 'F')"
    [1] => "('G', 'H', 'I', 'J', 'K', 'L')"
    [2] => "('M', 'N', 'O', 'P', 'Q', 'R')"
    ....
    [30000] => "('S', 'T', 'U', 'V', 'W', 'X')"
)

一次元配列を扱っていれば、うまくいきますimplode()

于 2012-08-29T18:41:26.013 に答える
3

PHP でこれを行うには、指定した多次元配列を処理します。

foreach($array as $arr){
    $values[] = "('".implode("','", $arr)."')";
}

$values = implode(",", $values);
INSERT INTO table_name VALUES $values; 

を使用することをお勧めしますtransactionsMySQLiまたはについてはこちらをお読みくださいPDO

于 2012-08-29T18:43:45.323 に答える
0

クイックフィックス:

$rows = array();

foreach($originalArray as $row){

   $rows[] = '(' . implode(',' $row) . ')';

}

$finalString = implode(',', $rows);

クエリをチャンクに分割しますが、1000行としましょう。

于 2012-08-29T18:45:38.583 に答える
0

Implode はこのための仕事ではありません。準備された SQL ステートメントを使用して確認し、配列を反復処理して、配列ごとにステートメントを実行します。

http://php.net/manual/en/mysqli.prepare.php

foreach($your_array as $entry) {
    // execute the prepared sql statement here

}
于 2012-08-29T18:45:53.880 に答える
0

トランザクションを使用しないのはなぜですか (MySQL を使用していると仮定して)。そうすれば、クエリを作成して一度に送信できますか?

http://dev.mysql.com/doc/refman/5.0/en/commit.htmlを見てください。

于 2012-08-29T18:43:13.450 に答える
0

文字列を結合しているのではなく、配列を内破しています。データ構造が適切な文字列である場合、次のようにダンプされます

[0] => "(a,b,c)",
       ^-------^---
[1] => "(d,e,f)", 
       ^-------^--0
etc...

私がハイライトした引用に注意してください。最初にこれらのサブ配列のそれぞれを個別に内破し、次に親配列を内破する必要があります。

foreach ($yourarr as $key => $subarr) {
    $yourarr[$key] = "('" . implode("','", $subarr) . "')";
}
$bigstring = implode($yourarr);

さらに、これは、 のような SQL メタ文字を含まない子配列の個々の値にも依存します'。自分自身を挿入して挿入クエリを強制終了する可能性があるため、この種のことを行うには非常に注意してください。

于 2012-08-29T18:45:08.457 に答える