我有这个功能可以去除非法字符,并且工作正常。
这是代码。
<?php
function fix_output($value, $key){
$new_array = array();
$newstr = '';
$good[] = 9; #tab
$good[] = 10; #nl
$good[] = 13; #cr
for($a=32;$a<127;$a++){
$good[] = $a;
}
$len = strlen($value);
for($b=0;$b < $len; $b++){
if(in_array(ord($value[$b]), $good)){
$newstr .= $value[$b];
}//fi
}//rof
$new_array[$key] = $newstr;
return $new_array;
}
$array = array();
$array['references1'] = 'Foo1 ◻◻◻◻◻◻◻◻◻◻◻◻';
$array['references2'] = 'Foo2 ◻◻◻◻◻◻◻◻◻◻◻◻';
array_walk($array,"fix_output");
print_r($array);
我想array_walk
使用 PHP 函数,但是当我使用 print_r($array)
时,它没有去除非法字符。这似乎有什么问题?任何想法都会有所帮助!请指出不清楚的地方!
array_walk
回调不返回任何内容,返回值也不会更改值。
如果要更改值,请将参数声明为引用 ( &$value
),并在回调结束时重新赋值变量。
工作示例:
<?php
function fix_output(&$value, $key){
$newstr = '';
$good[] = 9; #tab
$good[] = 10; #nl
$good[] = 13; #cr
for($a=32;$a<127;$a++){
$good[] = $a;
}
$len = strlen($value);
for($b=0;$b < $len; $b++){
if(in_array(ord($value[$b]), $good)){
$newstr .= $value[$b];
}//fi
}//rof
$value = $newstr;
}
$array = array();
$array['references1'] = 'Foo1 ◻◻◻◻◻◻◻◻◻◻◻◻';
$array['references2'] = 'Foo2 ◻◻◻◻◻◻◻◻◻◻◻◻';
array_walk($array,"fix_output");
print_r($array);
输出:
Array
(
[references1] => Foo1
[references2] => Foo2
)
或者,您可以重构并使用 array_map
,这将创建并返回一个新数组。
<?php
function fix_output($value){
$newstr = '';
$good[] = 9; #tab
$good[] = 10; #nl
$good[] = 13; #cr
for($a=32;$a<127;$a++){
$good[] = $a;
}
$len = strlen($value);
for($b=0;$b < $len; $b++){
if(in_array(ord($value[$b]), $good)){
$newstr .= $value[$b];
}//fi
}//rof
return $newstr;
}
$array = array();
$array['references1'] = 'Foo1 ◻◻◻◻◻◻◻◻◻◻◻◻';
$array['references2'] = 'Foo2 ◻◻◻◻◻◻◻◻◻◻◻◻';
$new_array = array_map("fix_output", $array);
print_r($new_array);
array_walk
可以选择让您通过引用传递值。这就是你想要做的。请参阅$value
前面的&
:
<?php
function fix_output(&$value, $key) {
$good = array_merge(range(32, 127), [
9, // tab
10, // nl
13 // cr
]);
$value = join("", array_map(
"chr",
array_intersect(
array_map("ord", str_split($value)),
$good
)
));
}
$array = array();
$array['references1'] = 'Foo1 ◻◻◻◻◻◻◻◻◻◻◻◻';
$array['references2'] = 'Foo2 ◻◻◻◻◻◻◻◻◻◻◻◻';
array_walk($array,"fix_output");
print_r($array);
现在您的输出是:
Array
(
[references1] => Foo1
[references2] => Foo2
)
我更改了实现以使用更多的array_*
函数,因此您可以看到如果将它们组合在一起可以有多强大。也不是如何使用range()
来构建初始良好数组(也请检查array_fill_keys
)。
问题是,你不编辑原始数组。通过引用将第一个参数传递到回调函数中:
function fix_output(&$value, $key){
查看array_walk (http://php.net/manual/en/function.array-walk.php) 的文档。关键是,他们通过"&$item 1"(第一个示例中的函数"test_alter")保存编辑后的值。
我认为,如果您在"fix_output"函数的末尾添加一个"var_dump($new_array)",它将显示您想要的内容。
您的复杂代码试图替换 ASCII 图表上 !
和 ~
之间的每个字符以及空格。 此任务很容易归结为一个简单的preg_
函数调用和仅包含否定字符类的短正则表达式模式。 不需要循环,因为preg_replace()
会很乐意自己迭代数组。
代码:(演示)
var_export(
preg_replace('/[^!-~'s]+/', '', $array)
);
输出:
array (
'references1' => 'Foo1 ',
'references2' => 'Foo2 ',
)