【问题标题】:PHP recursive function not allowing page to loadPHP递归函数不允许页面加载
【发布时间】:2021-08-20 02:56:09
【问题描述】:

我试图在不包含另一个文件的路径以及文件名的文件的每一行中显示总数, 但是如果它有一个到另一个文件的路径,则循环遍历该文件并将它拥有的所有数字相加,只要当前文件中存在一个文件的路径,循环就会继续进行。

这是我的代码

function fileProcessor($value){
    if(file_exists(trim($value))){
        $total = 0;
        $files = file($value, FILE_SKIP_EMPTY_LINES);
        foreach($files as $data) {
            if(!preg_match("/.txt/i", $data)){
                $num = floatval($data);
                $total += $num;
            } else {
                fileProcessor(trim($data));
            }
        }
        echo $value. ' -  ' .($total);
    } else {
        echo 'File does not exist';
    }

    fileProcessor('text_files/first.txt');
}

我正在使用 3 个 .txt 文件,在这些文件中我有类似的内容

first.txt


  • 1
  • 3
  • 3
  • second.txt

second.txt


  • 2
  • 3
  • 第三个.txt

第三个.txt


  • 1
  • 2

我正在寻找的输出


  • first.txt - 15
  • second.txt - 8
  • third.txt - 3

如果有人能指出我正确的方向,我将不胜感激,我不知道我是否做得对。

【问题讨论】:

  • 对于初学者来说,你没有从函数返回任何东西,所以它不知道何时停止执行
  • 还有,你为什么总是打电话给fileProcessor('text_files/first.txt');?这意味着要开始这个过程吗?如果是这样,那可能应该在函数之外调用
  • 感谢@pew007 我正在调用函数fileProcessor('text_files/first.txt'); 来启动进程
  • 我也试过返回$total += $num;和fileProcessor(trim($data));,然后在这里发布问题,但没有用;

标签: php recursion infinite-recursion


【解决方案1】:

你的代码有两个问题:

  • 您没有在子文件的路径中包含源文件的目录,因此永远找不到这些文件。
  • 您没有从函数返回总数,以便更高级别的调用可以添加子文件的总数

更正这些问题,并将变量重命名为有意义的东西会给出以下代码:

function fileProcessor($filename){
    if(file_exists(trim($filename))){
        $total = 0;
        $rows = file($filename, FILE_SKIP_EMPTY_LINES);
        foreach($rows as $data) {
            if(!preg_match("/.txt/i", $data)){
                $num = floatval($data);
                $total += $num;
            }else {
                $total += fileProcessor(dirname($filename)."/".trim($data));
            }
        }
        echo $filename. ' -  ' .($total)."<br>\n";
    }else{
        echo "File does not exist<br>\n";
    }
    return $total;
}

fileProcessor('text_files/first.txt');

输出:

text_files/third.txt - 3
text_files/second.txt - 8
text_files/first.txt - 15

这会按照总数最终累积的顺序列出文件,因此最低级别首先出现。

[编辑] 如果文件中出现两个或多个文件名,我发现结果顺序存在问题。这是一个处理这个问题的重做版本。

要按照遇到的顺序列出文件,需要颠倒自然顺序。在下面的新版本中,我将文件名放在了一个通过引用传递的$fileList 数组中。该函数的每次新调用都将其结果添加到该数组的末尾。处理完成后,将显示数组。

function fileProcessor( &$fileList){
    // Get the last filename in the array
    end($fileList);
    $filename = key($fileList);

    if(file_exists(trim($filename))){
        // Accumulate the values
        $fileList[$filename] = 0;
        $rows = file($filename, FILE_SKIP_EMPTY_LINES);
        foreach($rows as $data) {
            if(!preg_match("/.txt/i", $data)){
                $num = floatval($data);
                $fileList[$filename] += $num;
            }else {
                // Recursive call. Add the next filename to the array
                $fileList[dirname($filename)."/".trim($data)]=0;
                $fileList[$filename] += fileProcessor($fileList);
            }
        }
    } else {
        $fileList[$filename]=  "File does not exist: $filename";
    }

    // return the total for the file to add to the accumulator for the file above.
    return  $fileList[$filename];
}


// Place the initial file in the array
$results = ['text_files/first.txt' => 0];

// run the function
fileProcessor($results);

// display the results
foreach($results as $filename=>$total) {
    echo $filename.' - '.$total."<br>\n";
}

输出:

text_files/first.txt - 15
text_files/second.txt - 8
text_files/third.txt - 3

【讨论】:

  • 感谢您在尝试您提供的两个代码示例时提供的帮助,但是当我修改代码以指定页面不会加载的正确路径时,我一直遇到另一个错误 File does not exist&lt;br&gt; File does not exist&lt;br&gt; text_files/first.txt - 44之前
  • 我所有的 .txt 文件都位于 text_files 目录中
  • 代码在我的开发服务器上工作。它假设初始文件可以通过您传入的路径访问,并且所有附属文件都与起始文件位于同一目录中。如果您在此处修改了代码,但现在无法正常工作,则说明您的修改有问题。
  • 这是我的修改echo dirname($filename)."/".trim($data); //$total += fileProcessor(dirname($filename)."/".trim($data)); 我只是在回显fileprocessor function 中指定的目录以了解路径是否正确,而碰巧不是。它显示text_files/text_files/second.txttext_files/text_files/third.tx,但正确的路径是text_files/second.txt,当我进行更正时,页面只是继续加载,但不会像以前那样显示任何内容
  • 那么,还有其他问题。在您的服务器错误日志中查找可能的错误
【解决方案2】:

你可以使用静态变量:

<?php
function fileProcessor($value) {
    static $results = [];
    if (file_exists(trim($value))) {
        $results[$value] = 0;
        $files = file($value, FILE_SKIP_EMPTY_LINES);
        foreach($files as $data) {
            if (!preg_match("/.txt/i", $data)) {
                $num = floatval($data);
                $results[$value] += $num;
            } else {
                fileProcessor(trim($data));
            }
        }
    } else {
        echo 'File does not exist';
    }
    reset($results);
    if (key($results) != $value) {
        return;
    }
    foreach($results as $key => $value) {
        echo $key. ' -  ' .$value."\n";
    }
}

fileProcessor('text_files/first.txt');

输出:

text_files/first.txt -  7
text_files/second.txt -  5
text_files/third.txt -  3

【讨论】:

  • 谢谢,Artem,但结果还是一样,页面无法加载,它只会继续加载,但一段时间后不会显示任何内容,我会收到最大执行时间错误。如果我在终端中运行代码,它甚至根本不会加载
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多