2011-11-25 82 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進行驗證,指定數組鍵以及驗證第二個類中的日期格式/值以保持事情更加分開。如果用戶確實陷入困境

相關問題