尽管在foreach中,while循环仅运行一次

时间:2019-03-03 14:01:30

标签: php xml csv

我有一个ID数组和一个文件名数组。我正在遍历映射到CSV文件中的ID的每个ID。

脚本的想法是遍历这些ID,并根据ID为每个文件名创建一个xml文件。问题是创建结构并从csv文件中获取内容的while循环似乎仅针对第一个id运行。 (尽管foreach仍会遍历每个人吗?

我的代码:

<?php
echo "working .. wait";
ob_flush();
flush();
if (($handle = fopen("air_quality.csv", "r")) !== FALSE) {

    # define the tags - last col value in csv file is derived so ignore
    $header = array('id', 'desc', 'date', 'time', 'nox', 'no', 'no2', 'lat', 'long');

    # throw away the first line - field names
    fgetcsv($handle, 200, ",");

    # count the number of items in the $header array so we can loop using it
    $cols = count($header);

    #set record count to 1
    $count = 1;
    # set row count to 2 - this is the row in the original csv file
    $row = 2;

    $ids = array(3,6,8,9,10,11);
    $xml_files = array('brislington.xml', 'fishponds.xml', 'parson_st.xml', 'rupert_st.xml', 'wells_rd.xml', 'newfoundland_way.xml');

    # start ##################################################
    foreach($ids as $key=>$value) {
        $out = '<records>';

        while (($data = fgetcsv($handle, 200, ",")) !== FALSE) {

                    if ($data[0] == $value) {
                $rec = '<row count="' . $count . '" id="' . $row . '">';

                for ($c=0; $c < $cols; $c++) {
                    $rec .= '<' . trim($header[$c]) . ' val="' . trim($data[$c]) . '"/>';
                }
                $rec .= '</row>';
                $count++;
                $out .= $rec;
            }
            $row++;
        }

            echo $value;
        $out .= '</records>';

        # finish ##################################################

        # write out file
     file_put_contents($xml_files[$key], $out);
     fgetcsv($handle, 200, ",") === TRUE;
    }

    fclose($handle);



}
echo "....all done!";
?>

它确实创建了所有XML文件,但是只有第一个具有内容。如果6个xml文件具有从csv文件获取的数据,则预期输出。这些是创建的文件:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的内部循环重用了$handle,因此在第一次迭代之后,指针已经位于文件的末尾,并且不会再次遍历它。您可能需要在每次迭代后rewind( $handle )