2011-11-25 83 views
0

在我的应用我有一个文本,其中我的用户是指在格式输入数据:处理来自textarea的多行数据;更有效的方式?

Forename, Surname, YYYY-MM-DD, Company 
Forename, Surname, YYYY-MM-DD, Company 

每行。我的意图是,然后循环通过每一行,在逗号处爆炸并修剪任何空白区域。

我然后需要将分解数组传递到关联数组。我现在正在手动执行此操作,假设用户以正确的顺序和格式输入数据;它确实有效,但依靠用户不会搞砸。

你会建议什么作为这样做的更好的办法?我想我正在检查每个索引以查看它是否为空或者看起来非常笨重,以及容易出错。

任何建议或需要考虑的事情?

/************************************ 
* sample data from textarea: 
* Name, Surname, 1980-02-22, Company 
* Foo, Bar, 1970-05-12, Baz 
************************************/ 
$data = preg_split('/\r\n|\n/', $_POST['data'], 
            -1, PREG_SPLIT_NO_EMPTY); 

$item = array();     
// loop through the data    
foreach($data as $row) : 
    // trim and explode each line in to an array 
    $item[] = array_map('trim', explode(',', $row)); 
endforeach; 

$k=0; 
foreach($item as $user) : 

    $processed_data[$k]['first_name'] = !empty($user[0]) ? $user[0] : NULL; 
    $processed_data[$k]['last_name'] = !empty($user[1]) ? $user[1] : NULL; 

    if(!empty($user[2])) : 
     $dob = strtotime($user[2]); 
     if($dob) { 
      $processed_data[$k]['dob'] = $user[2]; 
     } else { 
      $processed_data[$k]['dob'] = NULL; 
     } 
    else: 
     $processed_data[$k]['dob'] = NULL; 
    endif; 

    $processed_data[$k]['company'] = !empty($user[3]) ? $user[3] : NULL; 
    $k++; 

endforeach; 

// print_r($processed_data); 
+1

应该发生什么?忽略该行?中止?修理它? –

回答

0

你是从旧学校:) 嗯,你说你上面希望用户在文本区域中输入正确的数据。那么,如果您的应用程序在一个强大的系统目前的工作不要去碰它,否则你应该考虑在你的POST请求添加不同的参数(每一个申请要爆炸)...

你可以做像这样来解决你现在的问题:

// The algorithm below believe user send data correctly 
// Forename, Surname, YYYY-MM-DD, Company 
$names = array('first_name', 'last_name', 'dob', 'company_name'); 

$lines = explode("\n", $_POST['data']); 

$result = array(); 
foreach ($lines as $ line) 
{ 
    $exploded_line = explode(",", $line); 
    $row = array(); 
    foreach ($exploded_line as $key=>$item) { $row[$names[$key]]= trim($item); } 
    $result[]=$row; 
} 

// Now in result there is an array like this 
// result[0][first_name] 
// result[0][last_name] 
// result[0][dob] 
// result[0][company_name] 
// result[1][first_name] 
// [ ... ] 
0

你可以将解析和验证封装到它自己的类中。此外,您可以对包含表格数据的数据结构执行相同的操作。

class TableParser 
{ 
    private $string; 
    public function __construct($string) 
    { 
     $this->string = (string) $string; 
    } 
    public function parse() 
    { 
     $buffer = $this->string; 
     $rows = explode("\n", $buffer); 
     $rows = array_map('trim', $rows); 
     return $this->parseRows($rows); 
    } 
    private function parseRows(array $rows) 
    { 
     foreach($rows as &$row) 
     { 
      $row = $this->parseRow($row); 
     } 
     return $rows; 
    } 
    private function parseRow($row) 
    { 
     $keys = array('forename', 'surname', 'date', 'company'); 
     $keyCount = count($keys) 
     $row = explode(',', $row, $keyCount); 
     if (count($row) != $keyCount) 
     { 
      throw new InvalidArgumentException('A row must have 4 columns.'); 
     } 
     $row = array_map('trim', $row); 
     $row = array_combine($keys, $row); 
     return $row; 
    } 
} 

此解析器仍然很粗糙。随着时间的推移,您可以改善它提供更好的错误处理,给出信息哪些行失败等。那么这样的部件可以更容易集成到正常的应用程序流,你可以返回这些信息反馈给用户,从而使她能够更改输入。

此外,您可以将验证拆分到第二个类中,只在解析器中进行爆炸/修整,但是对count进行验证,指定数组键以及验证第二个类中的日期格式/值以保持事情更加分开。如果用户确实陷入困境

相关问题