Вывести CSV в массив - PullRequest
       22

Вывести CSV в массив

0 голосов
/ 15 сентября 2011

Я использую WP Alchemy для создания мета-бокса с несколькими флажками.

Проблема, с которой я столкнулся, заключается в том, что у меня есть список академических курсов, из которого я хочу создать опции для флажков. Поэтому я беру csv, превращая его в массив, из которого сделаны коробки. Однако с кодом, который у меня есть сейчас, в массиве создается только последняя строка.

Я - самоучка FrankinCoder, когда дело доходит до php, так что держись со мной ...

<?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 ]

4 голосов
/ 15 сентября 2011

На каждой итерации цикла вы заменяете $ items, когда хотите добавить к нему, таким образом, он имеет только последнее значение.

Также http://php.net/fgetcsv может быть вам полезно.

2 голосов
/ 15 сентября 2011

Вы должны использовать функцию 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;
}
0 голосов
/ 15 сентября 2011

Вы перезаписываете массив $items.Я хотел бы предложить гораздо более простой метод для

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

?>

Я думаю, что как только вы поймете структуру захваченных данных, вы сможете использовать значения по своему усмотрению вВаш цикл вывода.

code, pre и php теги добавлены для удобства

0 голосов
/ 15 сентября 2011

Вам нужен дополнительный размер для вашего массива.

$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], );

}
0 голосов
/ 15 сентября 2011

элементов должны быть массивом в вашем случае.Инициализируйте его вне цикла while

$items = array();

А затем внутри цикла while

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

должно работать.

Также посмотрите на fgetcsv, как и предлагалось.

...