我有2个文件,buyerInterest.php
和carDetails.php
。当某人说出对汽车的兴趣时,他们将必须输入车牌号。然后,我将车牌号写入txt文件。然后,通过计算插入特定车牌的次数,我将能够显示buyerInterest.php
对汽车感兴趣的总人数。但是,同一辆车被显示了两次,计数增加了。
buyerInterest.php
<?php
if(isset($_POST['submit']))
{
$fname =$_POST['fname'];
$lname=$_POST['lname'];
$phone=$_POST['phone'];
$platenum=$_POST['platenum'];
$price=$_POST['price'];
$file = fopen("BuyerInterest.txt","a+");
$countfile = fopen("counter.txt","a+");
fwrite($file,$fname . ',');
fwrite($file,$lname . ',');
fwrite($file,$phone . ',');
fwrite($file,$platenum . ',');
fwrite($file,$price . PHP_EOL);
fwrite($countfile,$platenum . PHP_EOL);
print_r(error_get_last());
fclose($file);
fclose($countfile);
}
?>
carDetails.php
<table border="2">
<th>First Name</th>
<th>Last Name</th>
<th>Phone</th>
<th>Email</th>
<th>Plate Number</th>
<th>Model</th>
<th>Year of Manufacture</th>
<th>Description</th>
<th>No. of Kilometers Travelled</th>
<th>No. of Previous Owners</th>
<th>Characteristics of Recent Repairs</th>
<th>Number of people interested</th>
<?php
if(isset($_POST['submit']))
{
$search = $_POST['search'];
$lines = file('CarDirectory.txt');
$interest = file('counter.txt');
// Store true when the text is found
$found = false;
$counted = array_count_values(file('counter.txt'));
foreach($counted as $platenum => $count)
//echo "{$platenum} : {$count}";
foreach($lines as $line)
{
if(strpos($line, $search) !== false)
{
$found = true;
list($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k) = explode(',', $line);
print "<tr>
<td width=40>$a</td>
<td width=40>$b</td>
<td width=40>$c</td>
<td width=40>$d</td>
<td width=40>$e</td>
<td width=40>$f</td>
<td width=40>$g</td>
<td width=40>$h</td>
<td width=40>$i</td>
<td width=40>$j</td>
<td width=40>$k</td>
<td width=40>$count</td>
</tr>";
}
}
// If the text was not found, show a message
if(!$found)
{
echo 'No match found';
}
}
?>
counter.txt
SFR6543G
SFR1234H
SFR1234H
答案 0 :(得分:0)
无需将foreach ($lines as $line)
放在foreach ($counted as $platenum => $count)
内。因为嵌套的循环,你打印每个匹配的车线在$counted
,并使用计数无关的那些汽车每块板。您根本不需要外部循环。
由于$counted
是一个关联数组,因此您只需查找$counted[$e]
。
创建$counted
时,还需要删除换行符。
$found = false;
$counted = array_count_values(file('counter.txt', FILE_IGNORE_NEW_LINES));
foreach($lines as $line)
{
if(strpos($line, $search) !== false)
{
$found = true;
list($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k) = explode(',', $line);
$count = $counted[$e]
print "<tr>
<td width=40>$a</td>
<td width=40>$b</td>
<td width=40>$c</td>
<td width=40>$d</td>
<td width=40>$e</td>
<td width=40>$f</td>
<td width=40>$g</td>
<td width=40>$h</td>
<td width=40>$i</td>
<td width=40>$j</td>
<td width=40>$k</td>
<td width=40>$count</td>
</tr>";
}
}
顺便说一句,我建议您使用比$a
,$b
等更好的变量。您也可以使用fputcsv()
和fgetcsv()
来读写CSV文件,而不是手工写逗号。
答案 1 :(得分:0)
程序中的错误是您在读取数据时显示数据。因此,很难验证您是否已经显示了车牌号信息。
我将首先读取表中的所有数据(在内存中),确保行是唯一的(同一盘号不会出现两次),根据从文件中读取的信息维护表中的任何计数器。最后,一切正常后,只需打印表格即可。
现在,如果您有一个非常大的文件,则不妨使用数据库-即使是SQLite也比文本文件更好。 -正如@Barmar已经建议的那样。