2017-12-21 11 views
1

はじめに、と同様のの質問をしていますが、いくつかの質問を読んだことがありますが、私のコードに例を示して正しく実装できるものは何もありません。私は数千の数字を保持する配列を持っている、彼らはディレクトリ内のファイルの名前です。私はこれらのファイル名を検索するMySQL Queryを実行する必要がありますが、私はすべての個別のクエリを別の配列に入れる必要があります。ここでforeachループから文字列を配列に格納する方法は?

は、ファイル名をつかむために私のコードです:

$dir = "C:/Users/EyeCandy-Brian/Desktop/jobs"; 

$files = array_diff(scandir($dir), array('..', '.')); 

function truncate(&$fcn) { 
    $fcn = substr($fcn, 0, 6); // The original is '100100.dat', I only need the number 
}; 

array_walk($files, "truncate"); 

配列は次のようになります。

2 => string '100100' 
3 => string '100101' 
4 => string '100102' 
5 => string '100103' 
// About 1,500+ Total 

そして、ここでは私の宣言された変数と私のforeachループです:

$limit = 0; // This is for testing, stops after 5 iterations. 
$qryArrNum = 2; // The index for the $files array, [0] & [1] were '.' & '..' 
$count = 0; // Which index I want to store the string in, starting at [0] 

$qry = array(); // I declare $qry as an array 

foreach ($files as &$qry) { 
    $qry[$count++] = "SELECT * FROM `table` WHERE `sku` LIKE '%$files[$qryArrNum]%'"; 
    ++$qryArrNum; 
    if (++$limit == 5) { 
     break; 
    }; 
}; 

ここにいますそれは野生になる。 var_dump($qry);を使用すると、私は'1001S4'となるはずがありません。 var_dump($files);を実行し、配列の最初の5つの文字列は以下のとおりです。

2 => string 'S00100' 
3 => string '1S0101' 
4 => string '10S102' 
5 => string '100S03' 
6 => string '1001S4' 

その後、次のことファイル名から期待される文字列です:

は、だから私の質問は、私は $qryが配列であることを得るのですか、である
7 => string '100105' 
8 => string '100106' 
9 => string '100107' 
// On for 1,500+ again 

は、各文字列は$filesの最初の値と$qry配列の次の文字列の検索を含むMySQLクエリであり、$filesから次の値を検索します。また、$filesの最初の一握りの値が、予想される値とまったく異なるのはなぜですか?

注:私は順次千プラスMySQLのクエリを実行すると、私のサーバーを殺害することをを理解し、私は一つの大きなクエリにそれらを組み合わせることimplode();を使用します、私は最初にこれを理解する必要があります。

+1

一致するすべてのアイテムを返します。外側( '$ qry')はforeach値と同じです。どうして? – FirstOne

+2

'foreach($ files as&$ qry)'は、あなたをめちゃくちゃさせるものです。 '$ qry [$ file] = 'SELECT * FROM ...'を使用することができます。 – Scuzzy

+3

ここでは、これを過度に複雑にしているようです。 – FirstOne

答えて

1

複数のクエリを実行する代わりに、mysql find_in_set()を使用できます。あなたがあなたのファイルを持っていたら https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set 、使用破を文字列に変換する

$tmp = implode(",",$files); 

SQL文は次のようになります。

$sql = "SELECT * FROM `table` WHERE FIND_IN_SET(`sku`,'{$tmp}')>0"; 

これはあなたが変数を持って

+0

OPコードを正しく読んでいるなら、彼は5回の質問の後にループから脱出したいと思うようです。もしそうなら、おそらくLIMIT 5をSQLクエリに追加しますか? –

+1

@CMiller変数 '$ limit'はWAMPのテスト目的のために厳密に存在します。私は5で停止しますので、何千回も繰り返すループを永遠に待つ必要はありません。それは私がクエリのimplodingを実装し、それを生きて押して、削除されますが、ありがとう! –

関連する問題