解析文本文件时的意外行为
Unexpected Behavior when Parsing Text File
我正在学习 PHP,但现在我被困住了。
我正在阅读脚本中的 .txt 文件。文件内容是这样的:
joe:secret
root:admin
我可以使用 file()
函数轻松读取文件,其中 returns 一个数组。我将数据存储在一个变量中:
$data = file('location/file.txt');
接下来我使用 foreach 循环,然后我分解每一行,并将其内容再次存储在一个变量中。然后我检查变量,但这是我不理解的行为。
foreach ($data as $d) {
$row = explode(":", $d);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "match found ";
}
}
以上代码确实给出了预期的输出。这是为什么?如果我这样做,
echo $row[0]; echo $row[1];
然后我确实收到了正确的输出。所以我不明白为什么我的检查失败了?
这个很棘手;我不怪你没听懂:)
首先,让我们用 php -a
交互式 shell:
进行调查
php > $data = file('test.txt');
php > var_dump($data);
array(3) {
[0]=>
string(11) "joe:secret
"
[1]=>
string(11) "root:admin
"
[2]=>
string(1) "
"
}
看看收盘价是如何在单独的一行上的?这是因为每行末尾的 \n
都保存在 $data
中的每个数组元素内。所以 $row[1]
不 等于 "secret"
;它等于 "secret\n"
。要解决这个问题,我们只需要 rtrim()
:
foreach ($data as $line) {
$line = rtrim($line);
$row = explode(":", $line);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}
现在,它按预期工作:
php > $data = file('test.txt');
php > foreach ($data as $line) {
php { $line = rtrim($line);
php { $row = explode(":", $line);
php {
php { if ($row[0] == "joe" && $row[1] == "secret") {
php { echo "Match found for joe!";
php { }
php { }
Match found for joe!
php >
编辑: 我们也可以使用 file_get_contents()
而不是 file()
,所以我们只是将文件内容作为字符串获取,并将其转换为自己排列:
$data = file_get_contents('test.txt');
foreach (explode("\n", $data) as $line) {
$row = explode(":", $line);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}
我正在学习 PHP,但现在我被困住了。 我正在阅读脚本中的 .txt 文件。文件内容是这样的:
joe:secret
root:admin
我可以使用 file()
函数轻松读取文件,其中 returns 一个数组。我将数据存储在一个变量中:
$data = file('location/file.txt');
接下来我使用 foreach 循环,然后我分解每一行,并将其内容再次存储在一个变量中。然后我检查变量,但这是我不理解的行为。
foreach ($data as $d) {
$row = explode(":", $d);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "match found ";
}
}
以上代码确实给出了预期的输出。这是为什么?如果我这样做,
echo $row[0]; echo $row[1];
然后我确实收到了正确的输出。所以我不明白为什么我的检查失败了?
这个很棘手;我不怪你没听懂:)
首先,让我们用 php -a
交互式 shell:
php > $data = file('test.txt');
php > var_dump($data);
array(3) {
[0]=>
string(11) "joe:secret
"
[1]=>
string(11) "root:admin
"
[2]=>
string(1) "
"
}
看看收盘价是如何在单独的一行上的?这是因为每行末尾的 \n
都保存在 $data
中的每个数组元素内。所以 $row[1]
不 等于 "secret"
;它等于 "secret\n"
。要解决这个问题,我们只需要 rtrim()
:
foreach ($data as $line) {
$line = rtrim($line);
$row = explode(":", $line);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}
现在,它按预期工作:
php > $data = file('test.txt');
php > foreach ($data as $line) {
php { $line = rtrim($line);
php { $row = explode(":", $line);
php {
php { if ($row[0] == "joe" && $row[1] == "secret") {
php { echo "Match found for joe!";
php { }
php { }
Match found for joe!
php >
编辑: 我们也可以使用 file_get_contents()
而不是 file()
,所以我们只是将文件内容作为字符串获取,并将其转换为自己排列:
$data = file_get_contents('test.txt');
foreach (explode("\n", $data) as $line) {
$row = explode(":", $line);
if ($row[0] == "joe" && $row[1] == "secret") {
echo "Match found for joe!";
}
}