【问题标题】:PHP, CSV columns into separate arraysPHP,CSV 列到单独的数组中
【发布时间】:2011-01-26 09:23:00
【问题描述】:

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

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

我可以将选取的列存储在一个数组中,例如pick[]= "1,2,4"; //从1,2,3,4列 逗号分隔或我想要的任何方式。

但我怎样才能使用类似 list(1,2,4) = explode("," , theData[]);

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

【问题讨论】:

    标签: php list csv explode


    【解决方案1】:

    当您获得行索引和列索引时,csv 是一种二维数组。

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

    所有这些都可以自己轻松编码...

    或者你可以使用 fgetcsv 函数

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,但这里发生了什么:foreach( $theData as $k => &$thisData ) {
      • 标准 foreach 循环,变量通过引用传递 - 通常 PHP 创建数组的副本以进行 foreach,然后使用引用(即指向实际变量的链接)我们可以取消设置 $thisData并从 $theData 中删除该变量-希望这是有道理的!如果没有,请查看php.net/manual/en/language.references.php
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-29
        • 2023-03-09
        • 2017-12-19
        • 1970-01-01
        • 2012-10-17
        相关资源
        最近更新 更多