PHP, CSV столбцы в отдельные массивы - PullRequest
1 голос
/ 11 марта 2010

По сути, я хочу создать систему, в которой пользователь может загрузить файл CSV и выбрать столбцы, которые он хочет загрузить / обработать

Я могу сделать это хорошо, используя fopen и foreach, но так как номер столбца может варьироваться от CSV до CSV ....

я могу хранить выбранные столбцы в массиве, например selected [] = "1,2,4"; // из 1,2,3,4 столбцов Запятая или в любом случае я хочу.

но как я могу использовать что-то вроде list (1,2,4) = explode (",", theData []);

где я могу загрузить 1,2,4, там динамически, или даже 1,2,3,4, а затем я могу проигнорировать 3.

Ответы [ 3 ]

0 голосов
/ 11 марта 2010

Вы можете удалить ненужные столбцы из каждой строки:

$theData = array(
    array( 'col1', 'col2', 'col3', 'col4', 'col5' ),
    array( 'col1', 'col2', 'col3', 'col4', 'col5' ),
    array( 'col1', 'col2', 'col3', 'col4', 'col5' )
    );
$picked = '1, 3, 5';

$totalColumns = count( $theData[0] );
$columns = explode( ',', $picked );
foreach( $theData as $k => &$thisData ) {
    for( $x = 1; $x < $totalColumns + 1; $x++ ) {
        if( ! in_array( $x, $columns ) ) {
            unset( $thisData[$x - 1] );
        }
    }
}

Следите за корректировкой 0-индекса в цикле for и unset - это потому, что вы использовали номера столбцов, которые не проиндексированы в вашем примере.

0 голосов
/ 11 марта 2010

Вы можете использовать array_intersect_key () : "возвращает массив, содержащий все записи в массиве array1, ключи которых присутствуют во всех аргументах."

http://www.php.net/manual/en/function.array-intersect-key.php

Итак, сначала вам нужно обработать данные построчно, например, в массив, который выглядит как

$data[column] = array(entries):

Пример: $data = array( 1 => array ( entry1, entry2, etc ), 2 => etc );

Затем вы показываете пользователю, какие столбцы существуют, пользователь выбирает столбцы, которые ему нравится использовать, например ::

.
$selected = array(1,2,4);

Затем выполните пересечение, чтобы получить массив с выбранными столбцами:

 $use = array_intersect_key($data, $selected);
0 голосов
/ 11 марта 2010

хорошо, CSV является своего рода двумерным массивом, так как вы получили индекс строки и индекс столбца.

Сначала вам нужно разделить разрывы строк (\ n), чтобы разделить все на отдельные строки. Затем каждый ряд должен быть разделен запятой. Для первой строки у вас будут имена столбцов.

Все это можно легко закодировать самостоятельно ...

Или вы можете использовать функцию fgetcsv

Функция объяснена на: http://php.net/manual/en/function.fgetcsv.php

...