将CSV输出到数组

时间:2011-09-14 20:02:07

标签: php csv checkbox meta-boxes

我正在使用WP Alchemy创建一个带有多个复选框的元框。

我遇到的麻烦是,我有一个csv学术课程列表,我想创建复选框选项。所以我把csv变成了一个盒子制成的阵列。但是,根据我现在的代码,只在数组中创建了LAST行。

当谈到php时,我是一个自学的FrankinCoder,对我来说很光......

<?php

$file_handle = fopen('curriculum.csv', 'r');

while (!feof($file_handle) ) {

$line_of_text = fgets($file_handle);
$parts = explode(',', $line_of_text);

$items = array ($parts[2] .$parts[3], );

}

fclose($file_handle);

?>

<?php foreach ($items as $i => $item): ?>

    <?php $mb->the_field('cb_ex3'); ?>

    <!-- similar to test #2, the same thing can be accomplished by simply
    adding array brackets "[]" to the name -->
    <input type="checkbox" name="<?php $mb->the_name(); ?>[]" value="<?php echo $item; ?>"<?php $mb->the_checkbox_state($item); ?>/> <?php echo $item; ?><br/>

<?php endforeach; ?>

在几百行代码中,我得到的只是最后一行。 这是我正在使用的实际文件:http://www.ouhsd.k12.ca.us/educational_services/curriculum/curriculum.csv

非常感谢任何帮助或建议!

5 个答案:

答案 0 :(得分:4)

在循环的每次迭代中,如果要添加$ item,则替换$ items,因此它只有最后一个值。

http://php.net/fgetcsv也可能对你有用。

答案 1 :(得分:2)

您应该使用fgetcsv()docs)功能,而不是尝试自己理解CSV数据。此外,您应该在循环文件时构建$items数组(而不是覆盖它),每次都添加一个新项目。

$file_handle = fopen('curriculum.csv', 'r');
fgets($file_handle); // this skips the csv header line
while (($parts = fgetcsv($file_handle)) !== FALSE) {
    $items[] = $parts[2] . ' ' . $parts[3];
}
fclose($file_handle);

foreach ($items as $item) {
    // Your HTML code goes here
    echo $item . PHP_EOL;
}

奖励积分(你会看起来更酷,使用对象和迭代器!)

$file = new SplFileObject('curriculum.csv');
$file->setFlags(SplFileObject::READ_CSV);
foreach (new LimitIterator($file, 1) as $parts) {
    $items[] = $parts[2] . ' ' . $parts[3];
}

foreach ($items as $item) {
    // Your HTML code goes here
    echo $item . PHP_EOL;
}

答案 2 :(得分:0)

项目应该是您的案例中的数组。在while循环之外初始化

$items = array();

然后在while循环中

$items[] = array ($parts[2] .$parts[3], );

应该有用。

另请参阅fgetcsv以及建议。

答案 3 :(得分:0)

您的阵列需要一个额外的维度。

$i=0;
$items= new array(); // i think you need this for some fun reason
while (!feof($file_handle) ) {

    $line_of_text = fgets($file_handle);
    $parts = explode(',', $line_of_text);

    $items[$i] = array ($parts[2] .$parts[3], );

}

答案 4 :(得分:0)

您正在覆盖$items数组。

我想建议一个更简单的方法
<code><pre><?php

    // in one step, load the datafile as an array, and loop over each line
    // then explode the line by comma, and add to $lines array
    foreach(file('curriculum.csv') as $line)
            $lines[] = explode(',',$line);

    // display the structure of the captured data
    print_r($lines);

?></pre></code>

我认为一旦你理解了捕获数据的结构,就可以在输出循环中使用你想要的值。

为方便起见,添加了

codeprephp个标记