2013-03-14 119 views
2

我正在將CSV文件的某些值讀入數組,並且希望在將每行插入MySQL數據庫之前對每個值運行一些基本驗證檢查。我想知道如何有效地做到這一點,用某種規則數組。驗證數組值的有效方法

例如,我只希望每一行中的某些位置值的CSV

$while ($data = fgetcsv....) 

$val1 = $data[2]; 
$val2 = $data[9]; 
$val3 = $data[11]; 

我想驗證每個VAL - 如果任何丘壑不驗證,將中止插入

if (ctype_alnum($val1) AND ctype_alnum($val2) AND is_numeric($val3)) 

上面的方法在處理大約30個值時開始看起來相當低效,所以我想知道是否通過創建一個存儲所需值位置和驗證規則的數組來改進它的方法。像下面的東西...

$vals = array(
'val1' => array('pos' => 2, 'rule' => 'ctype_alphanum') 
) 

任何指針就可以了.. ..!

回答

1

我不知道你需要什麼pos元素在數組中,但對於其他部分你可以看看這個。如果更復雜的需要改變它相應

$vals = array(
    'val1' => array(
     'rule' => 'ctype_alnum', 
    ), 
    'val2' => array(
     'rule' => 'ctype_digit', 
    ), 
); 

function print_out($val) 
{ 
    echo '<pre>'; 
    var_dump($val); 
    echo '</pre>'; 
} 

print_out($vals); 

array_walk($vals, function(&$value, $key){ 
    $result   = call_user_func($value['rule'], $value['value']); 
    $value['result'] = $result; 
}); 

print_out($vals); 

UPDATE

$var = fgetcsv(...);在這裏你從CSV一行。
$neededRange = array_slice($var, $x[, $n]);這樣你就會得到你需要的部分。 因爲我看到你只需要一個所有元素的規則,那麼。

array_walk($array, function(&$value, $key){ 
    $value = array(
     'value' => $value, 
     'rule' => 'ctype_alnum', 
    ); 
}); 

還更新了驗證算法。

+0

謝謝。 'pos'指數組中的位置(csv row),我將從這個字段中提取值。 – bsod99 2013-03-14 10:36:14

+0

難道你不能第一次得到一個你需要驗證的值,然後運行我的例子代碼的數組?看起來,這會更容易。 – Eugene 2013-03-14 10:40:59

+0

是的 - 這就是我現在這樣做的方式,只是逐個瀏覽每個字段,訪問所需的鍵 - >值並添加到數組中,但想知道是否有存儲鍵/ pos信息的方法對於每個字段以及驗證規則。可能不是.. – bsod99 2013-03-14 10:50:01