【问题标题】:Unexpected Behavior when Parsing Text File解析文本文件时的意外行为
【发布时间】:2016-09-10 10:37:45
【问题描述】:

我正在学习 PHP,现在我被困住了。 我正在阅读脚本中的 .txt 文件。文件内容是这样的:

joe:secret
root:admin

我可以使用file() 函数轻松读取文件,该函数返回一个数组。我将数据存储在一个变量中:

$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];

然后我确实收到了正确的输出。所以我不明白为什么我的检查失败了?

【问题讨论】:

  • 你说他们两个都给出正确的输出?
  • @kojow7 是的,我知道为什么会这样。您可以阅读接受的答案:)

标签: php text-processing


【解决方案1】:

这个很棘手;我不怪你没有抓住这个:)

首先,让我们使用php -a 交互式外壳进行调查:

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!";
  }
}

【讨论】:

  • 这使得 sesne :) 谢谢你可爱的解释。代码现在可以工作了。
  • 太棒了,没问题,乐于助人! :)
猜你喜欢
  • 2015-08-20
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多