使用PHP在页面上显示项目

时间:2015-10-18 21:35:26

标签: php html format

我有一个名为subjects.txt的文档,格式如下:

  

dateCreated会,主题,链接

     

18.10.2015," Math",http://address.html

     

17.10.2015,"英语",http://address.html

     

18.10.2015,"英语",http://address.html

     

19.10.2015," Science",http://address.html

     

17.10.2015," Math",http://address.html

该文件包含根据学校科目创建的网站的网址。一个主题可以有多个站点。

目标是使用PHP以下列格式打开,读取和显示文件内容:

  

数学

   Link 1
   Link 2
     

   Link 1
   Link 2
     

科学(因为只有一个链接,主题的名称是   链路)

到目前为止,我已经能够打开并阅读该文件了:

$file = "./subjects.txt";
$subjects = file_get_contents($file);

我在尝试确定如何以指定格式编写文件时遇到问题。

我尝试使用explode将元素与","分开。 - 但我不知道从哪里去。

4 个答案:

答案 0 :(得分:1)

您的输入文件看起来是Comma-separated values(CSV)格式。 PHP具有内置的fgetcsv功能,旨在简化文件中的CSV数据读取。

<?php
$file = './subjects.txt';
$fh = fopen($file, 'r');

if ($fh === false) {
    die("Can not read {$file}");
}

$data = array();
while (($row = fgetcsv($fh, 1000, ',')) !== false) {
    if ($row[0] === 'DateCreated') {
        // Ignore the column header row
        continue;
    }
    list($date, $subject, $link) = $row;
    if (!isset($data[$subject])) {
        $data[$subject] = array();
    }
    $data[$subject][] = $link;
}
fclose($fh);

foreach ($data as $subject => $links) {
    // TODO: output each subject here
}

答案 1 :(得分:0)

使用file_get_contents()的问题是将所有文件内容检索到$ subject。

您必须使用不同的方法。例如fgets()

$fp = fopen("./subjects.txt", "r");

if ($fp){
    while (($line = fgets($fp)) !== false){
        // So here you can treat each line individually.
        // You can use explode (";", $line) for example if the line is not empty  
    }
}

fclose($fp);

使用fgets()可以分别解析每个文件的行。

答案 2 :(得分:0)

如上所述,使用数据库执行此操作可能会更容易3行代码。这是你可以使用的一种方法。

$data = '18.10.2015,"Math",http: //address.html

17.10.2015,"English",http: //address1.html

18.10.2015,"English",http: //address2.html

19.10.2015,"Science",http: //address3.html

17.10.2015,"Math",http: //address4.html';
preg_match_all('~^(.*?),"(.*?)",(.*?)$~m', $data, $fields);
array_multisort($fields[2], SORT_STRING, $fields[1], $fields[3]);
$lastcat = '';
foreach($fields[2] as $key => $cat) {
    if($cat != $lastcat) {
        echo $cat . "\n";
    }
    $lastcat = $cat;
    echo $fields[3][$key] . "\n";
}

输出:

English
http: //address1.html
http: //address2.html
Math
http: //address4.html
http: //address.html
Science
http: //address3.html

array_multisort是类别的分组方式。

这是正则表达式正在做什么的regex101演示。 https://regex101.com/r/wN3nB2/1

单记录检查更新(仅对其进行了1次测试):

$data = '18.10.2015,"Math",http: //address.html

17.10.2015,"English",http: //address1.html

18.10.2015,"English",http: //address2.html

19.10.2015,"Science",http: //address3.html

17.10.2015,"Math",http: //address4.html';
preg_match_all('~^(.*?),"(.*?)",(.*?)$~m', $data, $fields);
array_multisort($fields[2], SORT_STRING, $fields[1], $fields[3]);
$lastcat = '';
foreach($fields[2] as $key => $cat) {
    if((empty($fields[2][($key +1)]) && $cat != $lastcat)|| ($cat != $lastcat && !empty($fields[2][($key +1)]) && $fields[2][($key +1)] != $cat)) {
        //single record
        echo $cat . $fields[3][$key] . "\n";
    } else {
        if($cat != $lastcat) {
            echo $cat . "\n";
        }
        $lastcat = $cat;
        echo $fields[3][$key] . "\n";
    }
}

答案 3 :(得分:0)

这是另一个版本

var table = $('#example').DataTable({
    data : sanitizeData(),
    columns : [
        { title : 'id', data : 'calendar_id' },
        { title : 'title', data : 'calendar_title' }
    ]
})