1

我在网页上有一个简单的下拉框。其中包括美国的所有州。当用户选择一个州时,我想让一个 PHP 脚本只返回处于用户选择的州的公司(作为 HTML)。

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

stateId,company,contact,phone,when,addy1
3,abc Mining,George,555-555-1234,June 6 2012,"Bronx,NY"
2,xyz Mining,Fred,555-555-2345,June 7 2012, “西雅图,华盛顿”
0,我的公司,我,555-555-3456,2012 年 6 月 8 日,“尤金,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>";

?>

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

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

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

4

3 回答 3

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);       
?>
于 2012-09-26T19:58:23.830 回答
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>
于 2012-08-02T21:02:34.087 回答
0

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

于 2012-08-02T20:59:49.360 回答