我有这个功能剥离非法字符,它工作正常。
这是代码。
<?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);
我想使用PHP函数array_walk
,但当我使用print_r($array)
时,它并没有删除非法字符。
这似乎是什么问题?任何想法都会有所帮助!
请指出不清楚的事情!
答案 0 :(得分:3)
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);
答案 1 :(得分:1)
问题是,您不编辑原始数组。通过引用将第一个参数传递给回调函数:
function fix_output(&$value, $key){
查看array_walk(http://php.net/manual/en/function.array-walk.php)的文档。关键是,他们通过“&amp; $ item1”保存编辑后的值(第一个例子中的函数“test_alter”)。
我想,如果你在“fix_output”函数的末尾添加一个“var_dump($ new_array)”,它将显示你想要的内容。
答案 2 :(得分:1)
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()
构建初始的 good 数组(也请检查array_fill_keys
)。