PHP: 过滤并发布一个文本文件
PHP: Filtering and posting a text file
我有一个文本文件,其中包含一个人的姓氏、地址、事故时间和事故原因,一行中用白色 space 分隔。我需要仅通过出于相同原因至少两次调用并回显的人来过滤此文件。
我是 PHP 的新手,所以我想要一个简单的方法。 :)
谢谢。
编辑:
我没有尝试任何东西,因为我什至不知道如何过滤文件内容。
$data = array($_POST['surname'], $_POST['address'], $_POST['time'], $_POST['reason']);
$info = implode(" ", $data)
$info .= "\r\n";
serialize($info);
file_put_contents("data.txt", $info, FILE_APPEND);
serialize($info);
这就是我将它写入文件的方式。
我爆破了文件,因为我需要让它们由 3 个白色 space 分隔,但这不再重要,所以我可以保留数组。
预期的输出应该是这样的:
Surname Address Time Reason
Adams Railroad 5 13:20 Heart Attack
Adams Railroad 5 23:35 Heart Attack
只需要重复具有匹配姓氏和原因的同一个人。
如果我理解得很好,txt 文件是一个 csv 文件,它使用 space 作为列的分隔符。所以使用 fgetcsv 函数来加载每一行的列。指定空格 space 作为分隔符。
更新
您的文本文件包含字符串、由换行符分隔的条目和由三个 space 分隔的值(实际上 html 编码为 space)。
这里我们读取整个 txt 文件,(有些人可以按行 line):
$whole_string = file_get_contents('data.txt');
所以首先我们得到每一行:
$entries = explode('\n',$whole_string);
然后压入值数组:
$whole_ar = array();
foreach($entries as $e){
$whole_ar[] = explode(' ',$e);
}//if 3 spaces in file are in html
我们得到:
array(
array(
'name','date','etc..'
),
array(
'name2','date','etc..'
),
array(
'name2','date','etc..'
)
)
您可以将数组存储在 php 文件中,以便以后 include('data.php');
像这样:
$file = '<?php $whole_ar='.var_export($whole_ar, TRUE)."; ?>";
file_put_contents('data.php', $file);
关于如何将此数组解析为目标副本的主要答案是迭代 or:
$answer = array_unique(array_diff_assoc($whole_ar, array_unique( $whole_ar)));
据我了解,当用户呼入时,您会得到这样的信息 string:
$newest = "Huchinson Estonia Tallin Geo street 13 2015.12.02 13:44 Gas leak"
你在变量中有这个字符串,如上所述。
然后你可以 explode string by space characters: $data = explode(" ",$newest);
这给你一个包含值的数组。第一个值是姓氏,最后一个值是事故原因。
像这样从数组中解析它们:echo $data[0];//this will be surname
和 echo end($data);//this will be accident type
您可以将这些值分配给变量,然后查找您的数据库中是否存在此姓氏和意外事故,而不是 echo:
if($saved_before == $data[0].end($data)){
echo "we are working on ".end($data).", be patient, dear ".$data[0];
}
p.s。点 (.) 用于连接字符串
这应该让你开始:
function parseIt($line) { return str_getcsv($line, " "); }
$all = array_map('parseIt', file('yourfile.txt'));
$names = array();
foreach ($all as $row) {
$uniqkey = $row[0].$row[3];
if (isset($names[$uniqkey])) {
echo implode(" ",$row);
$names[$uniqkey]++;
} else {
$names[$uniqkey] = 1;
}
}
我注意到您在编写代码的文件中使用了 3 个空格的分隔符,所以我在示例中使用了它 - 您可以在 str_getcsv(line, delimiter)
中将其设置为任何您想要的
解释:
第 1,2 行 - file()
将文件读入一个数组,该数组通过函数 parseIt()
此函数将解析行和 return行值数组。
第 3 行 - 数组 $names
将充当我们的记忆,最后它将所有名称 + 原因作为键,值将是出现次数的计数器。
第 4 行... - 遍历 $all
检查键是否存在于 $names
中,如果存在则打印该行并移动计数器,否则设置一个新键在 $names
中并将其值设置为 1(计数器)。
我有一个文本文件,其中包含一个人的姓氏、地址、事故时间和事故原因,一行中用白色 space 分隔。我需要仅通过出于相同原因至少两次调用并回显的人来过滤此文件。 我是 PHP 的新手,所以我想要一个简单的方法。 :) 谢谢。
编辑: 我没有尝试任何东西,因为我什至不知道如何过滤文件内容。
$data = array($_POST['surname'], $_POST['address'], $_POST['time'], $_POST['reason']);
$info = implode(" ", $data)
$info .= "\r\n";
serialize($info);
file_put_contents("data.txt", $info, FILE_APPEND);
serialize($info);
这就是我将它写入文件的方式。 我爆破了文件,因为我需要让它们由 3 个白色 space 分隔,但这不再重要,所以我可以保留数组。
预期的输出应该是这样的:
Surname Address Time Reason
Adams Railroad 5 13:20 Heart Attack
Adams Railroad 5 23:35 Heart Attack
只需要重复具有匹配姓氏和原因的同一个人。
如果我理解得很好,txt 文件是一个 csv 文件,它使用 space 作为列的分隔符。所以使用 fgetcsv 函数来加载每一行的列。指定空格 space 作为分隔符。
更新
您的文本文件包含字符串、由换行符分隔的条目和由三个 space 分隔的值(实际上 html 编码为 space)。
这里我们读取整个 txt 文件,(有些人可以按行 line):
$whole_string = file_get_contents('data.txt');
所以首先我们得到每一行:
$entries = explode('\n',$whole_string);
然后压入值数组:
$whole_ar = array();
foreach($entries as $e){
$whole_ar[] = explode(' ',$e);
}//if 3 spaces in file are in html
我们得到:
array(
array(
'name','date','etc..'
),
array(
'name2','date','etc..'
),
array(
'name2','date','etc..'
)
)
您可以将数组存储在 php 文件中,以便以后 include('data.php');
像这样:
$file = '<?php $whole_ar='.var_export($whole_ar, TRUE)."; ?>";
file_put_contents('data.php', $file);
关于如何将此数组解析为目标副本的主要答案是迭代 or:
$answer = array_unique(array_diff_assoc($whole_ar, array_unique( $whole_ar)));
据我了解,当用户呼入时,您会得到这样的信息 string:
$newest = "Huchinson Estonia Tallin Geo street 13 2015.12.02 13:44 Gas leak"
你在变量中有这个字符串,如上所述。
然后你可以 explode string by space characters: $data = explode(" ",$newest);
这给你一个包含值的数组。第一个值是姓氏,最后一个值是事故原因。
像这样从数组中解析它们:echo $data[0];//this will be surname
和 echo end($data);//this will be accident type
您可以将这些值分配给变量,然后查找您的数据库中是否存在此姓氏和意外事故,而不是 echo:
if($saved_before == $data[0].end($data)){
echo "we are working on ".end($data).", be patient, dear ".$data[0];
}
p.s。点 (.) 用于连接字符串
这应该让你开始:
function parseIt($line) { return str_getcsv($line, " "); }
$all = array_map('parseIt', file('yourfile.txt'));
$names = array();
foreach ($all as $row) {
$uniqkey = $row[0].$row[3];
if (isset($names[$uniqkey])) {
echo implode(" ",$row);
$names[$uniqkey]++;
} else {
$names[$uniqkey] = 1;
}
}
我注意到您在编写代码的文件中使用了 3 个空格的分隔符,所以我在示例中使用了它 - 您可以在 str_getcsv(line, delimiter)
解释:
第 1,2 行 -
file()
将文件读入一个数组,该数组通过函数parseIt()
此函数将解析行和 return行值数组。第 3 行 - 数组
$names
将充当我们的记忆,最后它将所有名称 + 原因作为键,值将是出现次数的计数器。第 4 行... - 遍历
$all
检查键是否存在于$names
中,如果存在则打印该行并移动计数器,否则设置一个新键在$names
中并将其值设置为 1(计数器)。