PHP 递归函数不允许加载页面
PHP recursive function not allowing page to load
我试图在不包含另一个文件的路径以及文件名的文件的每一行中显示总数,
但是如果它有一个到另一个文件的路径,则循环遍历该文件并对它拥有的所有数字求和,只要当前文件中存在一个文件的路径,循环就会一直持续下去。
这是我的代码
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
- third.txt
third.txt
- 1
- 2
我正在寻找的输出
- first.txt - 15
- second.txt - 8
- third.txt - 3
如果有人能给我指出正确的方向,我将不胜感激,我不知道我是否做对了。
您的代码有两个问题:
- 您没有在辅助文件的路径中包含源文件的目录,因此永远找不到这些文件。
- 您没有从函数返回总计,以便更高级别的调用可以添加附属文件的总计
更正这些问题,并将变量重命名为有意义的名称,得到以下代码:
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
您可以使用静态变量:
<?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
我试图在不包含另一个文件的路径以及文件名的文件的每一行中显示总数, 但是如果它有一个到另一个文件的路径,则循环遍历该文件并对它拥有的所有数字求和,只要当前文件中存在一个文件的路径,循环就会一直持续下去。
这是我的代码
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
- third.txt
third.txt
- 1
- 2
我正在寻找的输出
- first.txt - 15
- second.txt - 8
- third.txt - 3
如果有人能给我指出正确的方向,我将不胜感激,我不知道我是否做对了。
您的代码有两个问题:
- 您没有在辅助文件的路径中包含源文件的目录,因此永远找不到这些文件。
- 您没有从函数返回总计,以便更高级别的调用可以添加附属文件的总计
更正这些问题,并将变量重命名为有意义的名称,得到以下代码:
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
您可以使用静态变量:
<?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