2011-01-31 274 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是未修改数组中对应于正确修改的“管家”值的数值。

相关问题