2014-06-12 64 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