PHP,CSV列成单独的数组

时间:2010-03-11 13:48:58

标签: php list csv explode

基本上,我想创建一个系统,用户可以上传CSV文件并选择他们想要上传/处理的列

我可以通过使用fopen和foreach来做到这一点, 但由于列数可能会因CSV而异....

我可以将拾取的列存储在一个数组中,例如pick [] =“1,2,4”; //来自1,2,3,4列 逗号分开或无论如何我想要。

但我怎么能使用像list(1,2,4)= explode(“,”,theData [])之类的东西;

我可以在那里加载1,2,4,动态地,甚至1,2,3,4然后我可以忽略3。

3 个答案:

答案 0 :(得分:0)

当你得到行索引和列索引时,csv就是一个二维数组。

首先,您必须拆分换行符(\ n)以将所有内容拆分为单独的行。然后每行必须用逗号分隔。对于第一行,您将拥有列名。

所有这一切都可以轻松编码......

或者您可以使用 fgetcsv 功能

解释函数: http://php.net/manual/en/function.fgetcsv.php

答案 1 :(得分:0)

您可以取消设置每行不需要的列:

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

注意for循环和unset中的0索引调整 - 这是因为您在示例中使用了非0索引的列号。

答案 2 :(得分:0)

您可以使用 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);