将PHP、CSV列放入单独的数组中

将PHP、CSV列放入单独的数组中,php,list,csv,explode,Php,List,Csv,Explode,基本上,我想制作一个系统,用户可以上传CSV文件,并选择他们想要上传/处理的列 我可以用fopen和foreach很好地做到这一点, 但由于列的数量可能因CSV而异 我可以将拾取的列存储在数组中,例如picked[]=1,2,4//从1,2,3,4列开始 逗号分隔或者我想要的任何东西 但是我如何使用类似list1,2,4=爆炸,数据[] 我可以动态地加载1,2,4,甚至1,2,3,4,然后我可以忽略3。好的,csv是一种二维数组,因为你得到了行索引和列索引 首先,必须拆分换行符\n才能将所有内容

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

我可以用fopen和foreach很好地做到这一点, 但由于列的数量可能因CSV而异

我可以将拾取的列存储在数组中,例如picked[]=1,2,4//从1,2,3,4列开始 逗号分隔或者我想要的任何东西

但是我如何使用类似list1,2,4=爆炸,数据[]


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

好的,csv是一种二维数组,因为你得到了行索引和列索引

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

所有这些都可以很容易地编码自己

或者可以使用fgetcsv函数

函数的解释如下:

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

$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索引的列编号。

您可以使用array\u intersect\u key:返回一个数组,其中包含array1的所有条目,这些条目的键在所有参数中都存在

因此,首先需要逐行处理数据,例如,处理到

$data[column] = array(entries):
例如: 然后执行相交以获得具有选定列的数组:

 $use = array_intersect_key($data, $selected);

谢谢,但是这里发生了什么:foreach$theData作为$k=>&$thisData{通过引用传递变量的标准foreach循环-通常PHP会创建一个数组副本以供foreach通过,并使用一个引用,即指向实际变量的链接,然后我们可以取消设置$thisData,并将该变量从$theData中删除-希望有意义!如果没有,请检查
$selected = array(1,2,4);
 $use = array_intersect_key($data, $selected);