我有一个包含数据行的csv文件,每行可以包含可变数量的值。 我想过滤文件的每一行,看它是否有特殊字符或错误的值,如果是,则将从整个过程中跳过该行。 所以这是我的代码:
<?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);
?>
我的问题在于,作为值数组的行是一个索引数组,没有键,我试图填写键但是我仍然没有得到好的结果,而且值不会超过&#39 ;过滤。 我的第二个问题是,我想对所有值应用一个过滤器,这个过滤器是一个正则表达式,所以我不能这样做:
filter_var_array($arr,FILTER_VALIDATE_REGEXP);
因为我必须提供options
:
PHP Warning: filter_var_array(): 'regexp' option missing
这样的事情并不起作用:
filter_var_array($line,FILTER_VALIDATE_REGEXP,[ 'options' => array('regexp' => '/[a-zA-Z0-9_:.()\s-\/]*/')]);
因为filter_var_array的参数应该是2个数组和一个布尔值:
PHP Warning: filter_var_array() expects parameter 3 to be boolean
总结一下:
filter_var_array
?答案 0 :(得分:1)
如果一行(数组)中有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]*$/'),
)
)