call_user_func()用于验证数组值

时间:2013-03-14 22:52:49

标签: php arrays csv

我想通过数组预设字段的验证规则,例如:

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

这些字段将从CSV导入并在符合基本验证时插入数据库。

E.g

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

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

我想做什么,而且我不确定如何准确地执行此操作,现在使用$array数组中的预设规则交叉引用$fields数组。如果任何字段未验证,则此行的导入将被中止。

任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:1)

这应该是你需要的:

foreach ($vals as $key => $rule)
{

  if (function_exists($rule['rule']) && !call_user_func($rule['rule'], $array[$key]))
  {
    continue 2;
  }

}

答案 1 :(得分:1)

我看到的问题是,您必须确定如何验证每个列,例如,第0列是否被验证为字母数字或数字?另一种为每列提供验证上下文的方法如下:

$columnsDigit = array(0, 3, 7, 8);
$columnsAlnum = array(1, 2, 4, 5, 6);

$while ($line = fgetcsv....) {

    foreach ($line as $column => $value) {

        if ((in_array($column, $columnsDigit)) && (false === ctype_digit($value))) {
            continue 2;
        }

        elseif ((in_array($column, $columnsAlnum)) && (false === ctype_alnum($value))) {
            continue 2;
        }
    }

    // Do something with your valid line
 }