使用PHP,读取csv文件,有条件地输出到HTML

问题描述:

我在网页上有一个简单的下拉框。在这里是美国的所有州。当用户选择一个国家, 我想有一个PHP脚本只返回处于用户选择状态(作为HTML)的公司。使用PHP,读取csv文件,有条件地输出到HTML

我有一个CSV文件,该文件内容如下:

STATEID,公司,联系人,电话,当时,addy1
3,ABC矿山,乔治,555-555-1234,2012年6月6日,“Bronx,NY”
2,xyz mining,Fred,555-555-2345,2012年6月7日,“Seattle,WA”
0,我的公司,Me,555-555-3456,2012年6月8日,尤金,OR“
3,贵公司,您,555-555-4567,2012年6月9日,”Bronx,NY“

和和和上....

使用上述,具有STATEID = 3

所以通过一个HTML表返回,只有数据(或CSV线)...我已经看到很多使用fgetcsv的方法,但是我将如何完成上述问题?

我想你会抢下拉列表选择索引值,把它作为一个条件,通过每个迭代线,只输出那些拥有3状态ID ...

理想的情况下,我想在表格中输出它们,但是列表或直接文本可以。

对于PHP来说相对来说比较新(从我甚至看了它已经有10多年了...) - 我真的很感谢这个帮助。

我知道......数据库会更容易 - 但我完全控制了csv,宁愿暂时走这条路。

<?php 

echo "<table>\n"; 

$row = 0; 
$handle = fopen("mycsvfile.csv", "r"); 

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    if ($row == 0) { 
     // column line 
     $num = count($data); 
     echo "<thead>\n<tr>"; 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
      echo "<th>" . $data[$c] . "</th>"; 
     } 
     echo "</tr>\n</thead>\n\n<tbody>"; 
    } else { 
     // non-header lines 
     $num = count($data); 
     echo "<tr>"; 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
      echo "<td>" . $data[$c] . "</td>"; 
     } 
     echo "</tr>\n"; 
    } 
} 
fclose($handle); 

echo "</tbody>\n</table>"; 

?> 

我开始在这之后失去它。这只是输出的所有数据 - 我还需要它来显示用户选择的唯一状态数据,通过一个变量,而不是输出线是为其他国家没有选择。我是使用strpos(),explode(),split()...我是一个dotNet程序员,很少有没有经验的PHP - 我希望学习。这是我的第一个项目 - 让我轻松点!我不知道,也没有使用PHP函数/方法 - 所以我不熟悉它们。 ;)

我已经启动XAMPP并运行,所以我并不完全没有希望。

+2

你有问题吗?我们不会为你写代码。这听起来像你有足够的方法来开始编写代码,那么为什么你不这样做呢? – 2012-08-02 20:43:48

+0

发布您迄今尝试的代码。另外,我看到两个“3”的状态ID是否意图? – 2012-08-02 20:44:30

+0

csv数据应该进入数据库。它会使这更容易和更快。 – 2012-08-02 20:44:37

这里就是我最后做...

<?php 
    $selectedSt = $_GET["states"];// get method - should clean the data... 
$row = 0; 
$handle = fopen("mycsv.csv", "r");//open file 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    if ($row == 0) {//skip first row (headers) 
       $row++;} 
       else { 
     $stAbbrev = $data[0]; 
     if ($stAbbrev == $selectedSt){//show only selected state 
      $num = count($data); 
      $row++; 
      for ($c=0; $c < $num; $c++) { 
       if ($c==0){} 
       else{ 
        if ($data[$c]==""){}//if empty line 
        else{echo $data[$c]."<br />";}}}//write array item 
        echo "<br />";}}}//end it all with some white space 
    fclose($handle);  
?> 

您需要循环才能按照here所述的顺序读取文件。在循环中,每一行将以字段值的形式作为数组返回。测试用户选择的stateId,如果匹配,则将数组存储在另一个数组中。至于输出,再次循环,这次通过结果数组,按照您认为合适的方式将每个元素的html标记包装起来,并将该标记串联到一个字符串中。将此字符串发送到客户端。

我打算假设你的数据是在一个数组中。如何做到这一点的行为留给读者。

$state_data = array( 
    array( 
    'id' => '3', 
    'company' => 'abc mining', 
    'contact' => 'George', 
    'phone' => '555-555-1234', 
    'when' => 'june 6 2012', 
    'addy' => 'Bronx,NY'), 
    array(
    'id' => '2', 
    'company' => 'xyz mining', 
    'contact' => 'Fred', 
    'phone' => '555-555-2345', 
    'when' => 'june 7 2012', 
    'addy' => 'Seattle,WA'), 

... 

); 

然后,我只需要筛选出ID为3的所有子阵列。

function filter_out($var) { 
    return ('3' == $var['id']); 
} 

$my_states = array_filter($state_data, "filter_out"); 

最后,输出:

<table summary="state data"> 
<tr> 
    <th>ID</th> 
    <th>Company</th> 
    <th>Contact</th> 
    <th>Phone</th> 
    <th>When</th> 
    <th>Addy</th> 
</tr> 

<?php 
foreach($my_states as $my_state) { 
?> 
<tr> 
    <td><?php echo($my_state['id']); ?></td> 
    <td><?php echo($my_state['company']); ?></td> 
    <td><?php echo($my_state['contact']); ?></td> 
    <td><?php echo($my_state['phone']); ?></td> 
    <td><?php echo($my_state['when']); ?></td> 
    <td><?php echo($my_state['addy']); ?></td> 
</tr> 
<?php } ?> 

</table> 
+0

会堵塞这个,Bryan。谢谢你的发布 - 我会让你知道的... – 2012-08-02 21:24:02

+0

谢谢,布赖恩。对这个项目感到厌烦......最终今天完成了。我最终使用了你的想法 - 并修改它以适应应用程序。 – 2012-09-26 19:54:59

+0

@MM:太好了!很高兴它对你有效。 – BryanH 2012-09-27 16:13:48