2017-02-10 2 views
1

私はデータ行を持つcsvファイルを持っています。各行は可変数の値を持つことができます。 ファイルの各行に特殊文字や間違った値があるかどうかを調べたい場合は、その行をプロセス全体からスキップします。 は、だからここに私のコードです:ここfilter_var_valueを使用して1つの正規表現フィルタを持つインデックス付き配列をフィルタリングします。

<?php 

if (($handle = fopen('file.csv', "r")) !== false) { 
    while (($line = fgetcsv($handle, 1024, ";")) !== false) { 
     $keys = array('key'); 
     foreach($line as $value){ 
      $arr[] = array_fill_keys($keys,$value); 
     } 
     $args = array('filter' => FILTER_VALIDATE_REGEXP, 
        'options' => array('regexp' => '/[a-zA-Z0-9_:.()\s-\/]*/'),); 
     $result = filter_var_array($arr,$args); 
     var_dump($result); 

    } 
} 
fclose($handle); 
?> 

私の問題は、値の配列として行は、キーなしで、インデックス付きの配列であることである、と私は、キーを記入してみましたが、私はまだありません良い結果が得られ、値はフィルタリングされません。

:私は optionsを提供する必要がありますので

filter_var_array($arr,FILTER_VALIDATE_REGEXP); 

: 私の第二の問題は、私はすべての値に1つのフィルタを適用することで、単にこれを行うこのフィルタは正規表現であるので、私はカント

PHP Warning: filter_var_array(): 'regexp' option missing

このような何かがeather動作しません:

filter_var_array($line,FILTER_VALIDATE_REGEXP,[ 'options' => array('regexp' => '/[a-zA-Z0-9_:.()\s-\/]*/')]); 

filter_var_arrayのパラメータは2つの配列とboolean型でなければなりませんので:

PHP Warning: filter_var_array() expects parameter 3 to be boolean

だから、総括する:

で一つのフィルターを使用してこのファイルをフィルタリングする方法
  1. filter_var_array
  2. もしそれが不可能ならば、ファイル 全体を解析し、内容が正規表現と一致するかどうかを確認する良い方法はありますか?
+0

キーを作成し、多分、フィルタ・アレイのためにそれらを渡しますか? –

+0

これは私が上記で試したことです、foreachループで。 @u_mulder – Somar

答えて

1

行(配列)は、その中に4つの要素(1、2、3、4)、その後、あなたのループがある場合:

$keys = array('key'); 
foreach($line as $value){ 
    $arr[] = array_fill_keys($keys,$value); 
} 

を作成します。

$arr=array(
    0=>array("key"=>"one"), 
    1=>array("key"=>"two"), 
    2=>array("key"=>"three"), 
    3=>array("key"=>"four"), 
) 

はそうし不必要に多次元的です。 また、あなたの正規表現は真実であることになっています。文字列内のどこでも許容される文字が0個以上必要です。 私は正規表現パターン仮定を行い、それを調整します。 これを試してみてください:ここで

foreach($line as $key=>$value){ 
    $arr["k$key"]=$value; 
    $filters["k$key"]=array(
          'filter'=>FILTER_VALIDATE_REGEXP, 
          'options'=>array('regexp'=>'/^[a-zA-Z0-9_:.()\s-\/]*$/') 
          // the regex will allow an empty string 
          // or a string of any length containing only those characters. 
        ); 
} 
$result=filter_var_array($arr,$filters); 
if(in_array(false,$result)){ 
    echo "Line not valid"; 
}else{ 
    var_export($result); // with no invalid values, $result == $arr 
} 

Demoです。

可変出力:

$arr=array(
    'k0' => 'one', 
    'k1' => 'two', 
    'k2' => 'three', 
    'k3' => 'four', 
    ) 

$filter=array(
    'k0' => array(
     'filter' => 272, 
     'options' => array('regexp' => '/^[a-zA-Z]*$/'), 
    ), 
    'k1' => array(
     'filter' => 272, 
     'options' => array('regexp' => '/^[a-zA-Z]*$/'), 
    ), 
    'k2' => array(
     'filter' => 272, 
     'options' => array('regexp' => '/^[a-zA-Z]*$/'), 
    ), 
    'k3' => array(
     'filter' => 272, 
     'options' => array('regexp' => '/^[a-zA-Z]*$/'), 
    ) 
) 
関連する問題