使用explode Codeigniter创建PHP关联数组

时间:2014-06-12 12:29:51

标签: php codeigniter

我是Codeigniter的新手,并创建了一个表格,用户可以在用户输入网站网址列表,用户可以在文本区域中插入网站网址或上传csv文件,其中包含一个名为网站的标题。我使用codeigniter库CSVReader从csv读取数据并创建一个这样的数组:

Array ( [0] => Array ( [websites] => www.google.com ) [1] => Array ( [websites] => www.bing.com ) ) 

如果我尝试从PHP爆炸函数转换数组(如果用户输入网站通过textarea)数组看起来像这样:

Array(www.google.com,www.bing.com)

我的CSVReader代码如下:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class CSVReader {

var $fields;            /** columns names retrieved after parsing */ 
var $separator = ';';    /** separator used to explode each line */
var $enclosure = '"';    /** enclosure used to decorate each field */

var $max_row_size = 4096;    /** maximum row size to be used for decoding */

/**
 * Parse a file containing CSV formatted data.
 *
 * @access    public
 * @param    string
 * @param    boolean
 * @return    array
 */
function parse_file($p_Filepath, $p_NamedFields = true) {
    $content = false;
    $file = fopen($p_Filepath, 'r');
    if($p_NamedFields) {
        $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);
    }
    while( ($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false ) {  
        if( $row[0] != null ) { // skip empty lines
            if( !$content ) {
                $content = array();
            }
            if( $p_NamedFields ) {
                $items = array();

                // I prefer to fill the array with values of defined fields
                foreach( $this->fields as $id => $field ) {
                    if( isset($row[$id]) ) {
                        $items[$field] = $row[$id];    
                    }
                }
                $content[] = $items;
            } else {
                $content[] = $row;
            }
        }
    }
    fclose($file);
    return $content;
}
}

有人可以帮我创建相同风格的数组吗?

2 个答案:

答案 0 :(得分:1)

我认为你不需要一个完整的大型CSV阅读器来做到这一点。此外,CSV更多地表示表格数据(如果您有多列数据),您只需构建一个平面的网站列表 - 这大大简化了事情。我会推荐这样的东西;

$websites = "foo,bar\nbaz,qux"; // Input
$output = preg_split('#[\n\r\t,]+#', $websites); // Split by newlines, feeds, tabs, and commas
foreach ($output as &$o)
   $o = array('website' => trim($o));

// Or a shorter form for PHP 5+
foreach ($output as &$o)
   $o = ['website' => trim($o)];

如果您从表单中获取数据,则可以完全删除CSV代码,除非您希望处理报价或CSV文件上传。在这种情况下,您只需要一个循环来使数组关联。

如果数据是您想要关联的多维数组值,则可以使用以下循环(我编写了列,它们可以是您想要的任何内容):

// For PHP 4-
foreach ($output as &$o)
   $o = array(  'website' => $o[0], 'email' => $o[1], 'foo' => $o[2], 'bar'=>$o[3]  );

// Or a shorter form for PHP 5+
foreach ($output as &$o)
   $o = [  'website' => $o[0], 'email' => $o[1], 'foo' => $o[2], 'bar'=>$o[3]  ];

编辑:在第一个示例代码中添加了修剪。

答案 1 :(得分:0)

您希望两个数组匹配,但您没有指定希望数组最终使用哪种样式。

如果要转换CSV阵列,请执行以下操作:

foreach($csv_array as $website) {
     $website_array[] = $website['websites'];
}

如果要转换textarea数组,请执行以下操作:

$count = 0;
foreach($textarea_input as $website) {
     $website_array[$count]['websites'] = $website;
     $count++;
}

我认为第一个更容易管理,没有理由在数组中添加第二层,最好从具有多个层的数组中将数据提取到更简单的数组中。