2013-03-14 151 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