2

次のような配列を介してフィールドの検証ルールを事前設定したい:

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

これらのフィールドはCSVからインポートされ、基本的な検証を満たしている場合はデータベースに挿入されます。

例えば

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

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

私がやりたいこと、そしてこれを正確に行う方法がわからないことは、配列$array内の事前設定されたルールと配列を相互参照すること$fieldsです。いずれかのフィールドが検証されない場合、この行のインポートは中止されます。

これを行う方法はありますか?

4

2 に答える 2

1

これはあなたが必要とするものでなければなりません:

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

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

}
于 2013-03-14T22:57:34.937 に答える
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
 }
于 2013-03-14T23:16:09.767 に答える