2011-01-31 469 views
1

我有一個使用錯誤邏輯的全文搜索代碼,否則它將無法理解PHP的工作方式。首先,我有一個相當長的叫做* file_find *的函數,它返回一個數組。我有一個名爲文件的數組* all_files *中,我通過跑步步*的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); 
    } 
    } 
    } 
    } 

如果我打印出$ current_file因爲它發送到*的File_Find *,它反映的是爲了它應該是:A的,然後是B的,然後是C的等等。但是當我在結果返回後打印出$ keyfilename時,它們落後於實際提供給函數的文件。我最終是這樣的:

  • 當前文件:burnham.html
  • 當前文件:burroughs.html
  • 當前文件:burton.html
  • 當前文件:busch.html
  • 當前文件:busoni.html
  • 當前文件:butler.html
  • 返回的文件:阿爾比
  • 當前文件:byrd.html
  • 當前文件:byrnes.html
  • 當前文件:byron.html
  • 返回的文件: albeville 等

這一切都在同一如果file_exists語句,所以在* file_find *完成之前,代碼甚至不應該到達if foreach($ search_result ...)。但顯然它在後臺運行,並在其他幾個文件發送並堆疊後返回結果。如果我一次打印所有結果,這不會成爲問題,但我有AJAX一次發送100個批次的文件,並且它會將結果全部不按順序返回,A會在B之後進來並且結果會重複當他們不應該。

如何確保它等待代碼繼續執行,直到* file_find *完成?

+0

這並不是在後臺運行`find_file`的問題。 PHP不會也不能在單獨的線程中意外地運行一些函數,即使它不會以某種方式將結果追溯地合併到函數的初始返回值中。你的算法在某種程度上被打破了,認爲很難從樣本代碼中知道如何。 `file_find`到底做了什麼?偶然修改'$ all_files`嗎? – meagar 2011-01-31 19:49:04

回答

0

不知道這會起作用(因爲我不知道file_find函數在做什麼),但也許你可以將file_find函數($ search_result)的結果作爲另一個函數的參數填入array_push。這可能會阻止任何導致該功能亂序發生的事件。

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

我覺得有點傻,因爲即使我知道沒有辦法讓功能失靈。問題實際上是我有兩個文件名數組傳遞給Javascript,只有一個被修改,而另一個只是重複發送。未修改的那個是我打印結果的那個。

因此,當它會說「當前文件:管家,退回的文件:albee」時,albee是未修改數組中對應於正確修改的「管家」值的數值。

相關問題