2014-06-12 31 views
1

我是Codeigniter中的新手,并创建了一个表单来从用户输入网站列表,其中用户可以在按行分隔的textarea中插入网址或上载csv文件包含名为网站的标题。我使用笨库CSVReader来读取CSV数据并创建一个这样的数组:使用爆炸创建PHP关联数组Codeigniter

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

而如果我尝试转换从PHP数组爆炸功能(如果通过textarea的用户输入网址)阵列看起来是这样的:

我CSVReader的
Array(www.google.com,www.bing.com) 

代码如下:

<?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; 
} 
} 

可能有人请帮助我建立在相同的样式排列?

+0

你是什么意思“相同样式的数组”?你能给出一个期望的输出数组的例子吗?不确定这是否在你的问题中提到。 – Dan

+0

有2个输入选项,用户可以选择任何CSV文件上传或Textarea,我的问题是,我想从两个输入创建一个数组,并且数组结构应该是相同的。例如Array('website1','website2'); – user3172975

回答

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] ]; 

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

+0

感谢Kver宝贵的时间和良好的解释性解决方案。 – user3172975

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++; 
} 

我第一个想到的是更容易管理,有没有理由的第二层添加到您的阵列,更好从具有多个图层的阵列中将数据提取到更简单的数组中。

+0

谢谢丹你的时间。 – user3172975