我有一个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文件获取的数据,则预期输出。这些是创建的文件:
答案 0 :(得分:1)
您的内部循环重用了$handle
,因此在第一次迭代之后,指针已经位于文件的末尾,并且不会再次遍历它。您可能需要在每次迭代后rewind( $handle )
。