php - 显示.txt文件中每行的第一项

时间:2014-05-22 22:24:15

标签: php arrays text-files

我有一个.txt文件,其中包含遵循标准约定的行。我可以将.txt文件的每一行都读成数组,但我不能拆分每行中的空格并将每个单词放入一个新数组中,以列出每行的第一项。

Access.txt

2014-03-16 13:57:35.089 -0700 Information 98
2014-03-16 13:57:35.089 -0700 Information 22
2014-03-16 13:57:35.355 -0700 Information 638
2014-03-16 13:57:35.355 -0700 Information 94

LogsModel:

public function fileGetContents()
{
    $filename = 'C:/Program Files/FileMaker/FileMaker Server/Logs/Access.log';

    // Open the file
    $fp = @fopen($filename, 'r');

    // Add each line to an array
    if ($fp) {
        $lines = explode("\n", fread($fp, filesize($filename)));

        // split each line by " "
        foreach($lines as $line){
            $line_items = explode(" ", $line);

            return $line_items;
        }
    }
}

LogsController:

public function index()
{
    // load a model, perform an action, pass the returned data to a variable
    $logs_model = $this->loadModel('LogsModel');
    $line_items = $logs_model->fileGetContents();


    // load views.
    require 'application/views/_templates/header.php';
    require 'application/views/home/index.php';
    require 'application/views/_templates/footer.php';
}

家/ index.php的

<table class="table table-striped">
    <tr>
        <td>Date</td>
    </tr>
    <?php foreach ($line_items as $item) { ?>
        <tr>
            <td><?php echo $item ?></td>
        </tr>
    <?php } ?>
</table>

现在我从第一行获得所有项目......

DATE
2014-03-16
13:57:35.089
-0700   
Information 
98

我想要显示的是 EACH 行中的第一项......

DATE
2014-03-16
2014-03-16
2014-03-16
2014-03-16

3 个答案:

答案 0 :(得分:1)

非常简单:

  $line_items = explode(" ", $lines[0]); //split first line
  echo $line_items[0]; //print first item

如果您只想要一行中的一项,为什么您的方法称为fileGetContents()?您尝试将整个文件作为一行返回,不断循环。不会工作。您需要重新设计此方法。

答案 1 :(得分:0)

您的问题出在LogsModel中。

1)您需要将return $line_items;放在foreach(...){...}之外。

现在它位于内部并阻止foreach完成第一个循环并以第二个循环开始。

2)你不需要整个爆炸阵列,只需要第一位。

3)foreach内需要继续将第一位添加到数组中。

所以最后,你需要改变:

    foreach($lines as $line){
        $line_items = explode(" ", $line);

        return $line_items;
    }

成:

    $line_items = array();
    foreach($lines as $line){
        $tmp = explode(" ", $line);
        $line_items[] = $tmp[0];
    }
    return $line_items;

答案 2 :(得分:0)

Explode返回一个数组,因此您需要返回第一部分:

public function fileGetContents()
{
    $filename = 'C:/Program Files/FileMaker/FileMaker Server/Logs/Access.log';

    // Open the file
    $fp = @fopen($filename, 'r');

    $line_items = array();

    // Add each line to an array
    if ($fp) {
        $lines = explode("\n", fread($fp, filesize($filename)));

        // split each line by " "
        foreach($lines as $line){
            $l = explode(" ", $line);
            $line_items[] = $l[0];
        }
    }
   return $line_items;
}