我是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;
}
}
有人可以帮我创建相同风格的数组吗?
答案 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++;
}
我认为第一个更容易管理,没有理由在数组中添加第二层,最好从具有多个层的数组中将数据提取到更简单的数组中。