PHP读取文本文件时字符串无法存入数组,求问题排查及优化方法
问题分析与解决方案
先拆解你代码里的几个核心问题,这就是$text数组无法正确保存内容的根源:
- 数组被重复初始化:你在
while循环里每次都执行$text=array("zero--");,这意味着每循环一次,之前存在数组里的内容都会被清空,最后数组里只会剩下初始的"zero--",自然无法留存读取的条目内容。 parse_str使用逻辑错误:parse_str($line)会把整行字符串解析成变量,但只有当行是entry=xxx格式时,这才有意义。处理后续内容行时,执行这个函数会产生无效变量,而且$entry会保留上一次的值,导致内容被错误追加。strncasecmp判断逻辑反了:strncasecmp($line, "entry", 5)返回0表示该行以entry开头,你的代码里if (strncasecmp(...))是当返回值不为0(即不是entry行)时执行追加,但你应该先处理entry行确定当前数组键,再把后续内容行追加到对应键的元素里。global关键字多余:$text是在当前作用域定义的,用global不仅帮不了你保存数组内容,反而容易引发作用域混乱。
修正后的代码
调整逻辑后,能正确保存条目并实现反向显示:
<?php $test = fopen("test.txt", "r") or die("Unable to open file!"); $text = array(); // 数组初始化放在循环外,避免重复清空 $currentEntry = null; while (!feof($test)) { $line = trim(fgets($test)); // 去掉换行和首尾空格,过滤空行 if (empty($line)) continue; // 识别entry行,确定当前条目键 if (strncasecmp($line, "entry=", 6) === 0) { parse_str($line); // 解析entry=xxx,得到$entry变量 $currentEntry = $entry; $text[$currentEntry] = substr($line, 7) . "\n"; // 保存entry行的描述部分 } else if ($currentEntry !== null) { // 内容行追加到当前条目 $text[$currentEntry] .= $line . "\n"; } } fclose($test); // 记得关闭文件 // 反向遍历,优先显示最后一条 krsort($text); // 根据键值倒序排序 foreach ($text as $key => $content) { echo "<h3>Entry $key</h3>"; echo "<p>" . nl2br($content) . "</p>"; // 把换行转成网页的<br>标签 } ?>
更优的实现方式
PHP提供了更简便的文件读取函数,比如file()可以直接把文件每行读入数组,处理起来更简洁:
<?php // 读取所有行并过滤空行 $lines = array_filter(file("test.txt"), function($line) { return trim($line) !== ""; }); $entries = array(); $currentKey = null; foreach ($lines as $line) { $line = trim($line); if (strncasecmp($line, "entry=", 6) === 0) { // 用parse_str的第二个参数存储解析结果,避免污染全局变量 parse_str($line, $params); $currentKey = $params['entry']; $entries[$currentKey] = substr($line, 7) . "\n"; } else if ($currentKey !== null) { $entries[$currentKey] .= $line . "\n"; } } // 反向输出最后一条优先 krsort($entries); foreach ($entries as $id => $content) { echo "<div class='entry'>"; echo "<h4>Entry #$id</h4>"; echo nl2br($content); echo "</div>"; } ?>
这个方案的优势:
- 用
file()简化了文件读取流程,无需手动处理fopen/feof/fgets/fclose - 用
parse_str的第二个参数存储解析结果,避免全局变量污染 - 代码逻辑更清晰,可读性更强
内容的提问来源于stack exchange,提问作者Atmega 328
相关产品推荐
相关产品推荐

