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

时间:2012-08-02 20:40:42

标签: php csv

我在网页上有一个简单的下拉框。它是美国的所有州。当用户选择一个州时 我想让一个PHP脚本只返回用户所选状态的公司(作为HTML)。

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

  

STATEID,公司,联系人,电话的时候,addy1
  3,abc mining,George,555 - 555 - 1234,2012年6月6日,“布朗克斯,纽约”
  2,xyz mining,Fred,555-555-2345,2012年6月7日,“华盛顿州西雅图”   0,我的公司,我,555-555-3456,2012年6月8日,“Eugene,OR”
  3,贵公司,你,555 - 555 - 4567,2012年6月9日,“布朗克斯,纽约”

以及之前和之后......

使用上面的方法,通过HTML表返回只有stateId = 3的数据(或csv中的行)。

所以...我已经看到很多方法可以使用fgetcsv,但我怎样才能解决上述问题呢?

我原以为你抓住下拉列表的选定索引值,将其作为条件传递,遍历每一行,只输出状态ID为3的那些......

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

相对较新的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>";

?>

在这一点之后我开始失去它...这只是输出所有数据 - 我仍然需要它通过变量显示用户选择状态的数据,而不显示未选择的其他状态的NOT输出行

我是否使用strpos(),explode(),split()...我是一名dotNet程序员,几乎没有PHP经验 - 我希望学习。这是我的第一个项目 - 所以放轻松吧!我不知道并且没有使用过PHP函数/方法 - 所以我不熟悉它们。 ;)

我已经启动并运行了XAMPP,所以我并非完全无望。

3 个答案:

答案 0 :(得分:2)

这是我最终做的......

    <?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);       
?>

答案 1 :(得分:1)

我将假设您的数据在数组中。如何做到这一点的练习留待读者阅读。

$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>

答案 2 :(得分:0)

您需要一个循环来按行描述文件here。在循环中,每行将作为具有字段值的数组返回。测试用户选择的stateId,如果匹配,则将数组存储在另一个数组中。至于输出,再次循环,这次通过结果数组,在你认为合适的情况下将html标记包装在每个元素周围,并将该标记连接成一个字符串。将此字符串发送给客户端。