2011-01-31 13 views
1

エラーのあるロジックを使用するフルテキスト検索コードがあります。そうでなければ、PHPが動作することを理解できません。まず、配列を返す* file_find *というかなり長い関数があります。前の関数が終了する前にPHPでコードが続きました

$allftsearch_results = array(); 
for ($i = 0; $i <= count($all_files); $i++) { 
$current_file = $all_files[$i]; 
    //Run one file 
    if (file_exists($current_file)) { 
    $search_result = file_find($current_file, $phpfilenames[$i], $num_ands, $keywords_core, $keywords_boolean, $phpfilenames, $ascii_limit); 
    //Add file results to allftsearch_results array 
    if (!empty($search_result)) { 
    foreach ($search_result as $keyfilename => $invpagevalue) { 
    array_push($allftsearch_results, $keyfilename); 
    } 
    } 
    } 
    } 

それは* file_find *に送信されますように私は、$ current_fileをプリントアウトした場合、それはそれの順序を反映している:私はこのような各上file_find *、* all_files *と呼ばれるファイルの配列を私が実行してステップスルーすることを*持っていますAさん、Bさん、Cさんなどです。しかし、結果が返ってから$ keyfilenameを表示すると、実際に関数に送られたファイルの後ろに遅れてしまいます。

  • 現在のファイル::burnham.html
  • 現在のファイル:burroughs.html
  • 現在のファイル:burton.html
  • 現在のファイル:busch.html
  • 私はこのようなもので終わります現在のファイル:busoni.html
  • 現在のファイル:butler.html
  • 返されたファイル:オルビー
  • 現在のファイル:
  • 返されたファイルbyron.html:場合 albeville など

それはすべて同じ内です

  • 現在のファイルbyrnes.html:
  • 現在のファイルbyrd.html file_exists文であるため、* file_find *が終了するまでコードがforeach($ search_result ...)に到達しないようにしてください。しかし、それは明らかにバックグラウンドで実行されており、いくつかの他のファイルがそれに送られてスタックされた後に結果を返しています。一度にすべての結果を印刷すると問題はありませんが、AJAXは一度に100個のバッチを送信していますが、Bの後にAが来て結果が繰り返し返されます彼らはしないでください。

    * file_find *が終了するまで、コードの進行を待つことができますか?

  • +0

    これはバックグラウンドで実行されている 'find_file'では問題ありません。 PHPはあなたの関数のいくつかを別のスレッドで誤って実行することはできません。たとえそれがあったとしても、結果を関数の最初の戻り値に遡ってマージすることはありません。あなたのアルゴリズムは何らかの形で壊れているので、サンプルコードからどうやって分かりにくいと思っています。 'file_find'とはどういう意味ですか? '$ all_files'を偶然修正しますか? – meagar

    +0

    配列 '$ all_files'を生成するためにあなたは何を行い、' find_file() '関数のソースは何ですか? – KyleWpppd

    答えて

    0

    これは(私はfile_find機能がやっているのか分からないとして)動作しますが、おそらくあなたはarray_pushを下に別の関数の引数としてfile_find機能($のsearch_result)からの結果を詰め込むことができわかりません。これにより、ファンクションが順番どおりに実行されない原因を防ぐことができます。

    for ($i = 0; $i <= count($all_files); $i++) { 
        $current_file = $all_files[$i]; 
        if (file_exists($current_file)) { 
         filterReturn(file_find($current_file, $phpfilenames[$i], $num_ands, $keywords_core, $keywords_boolean, $phpfilenames, $ascii_limit)); 
        } 
    } 
    
    function filterReturn($search_result){ 
        if (!empty($search_result)) { 
         foreach ($search_result as $keyfilename => $invpagevalue) { 
          array_push($allftsearch_results, $keyfilename); 
         } 
        } 
    } 
    
    0

    機能が順不同で実行される方法がないことがわかっていても、私はちょっと馬鹿だと感じました。問題は実際には、私はファイル名の2つの配列がJavascriptを渡されていて、1つだけが変更され、もう一方は繰り返し送信されたということでした。変更されていないものは、私が結果をプリントしていたものでした。

    「現在のファイル:執事、返されたファイル:albee」と表示されるとき、albeeは、修正された配列の「執事」値に対応する未修正配列の値でした。

    関連する問題