Php 使用数组遍历剥离非法字符
我有这个功能,剥离非法字符,它的作品很好 这是代码Php 使用数组遍历剥离非法字符,php,Php,我有这个功能,剥离非法字符,它的作品很好 这是代码 <?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
<?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);
问题是,您没有编辑原始数组。通过引用将第一个参数传递到回调函数:
function fix_output(&$value, $key){
请参阅array_walk()的文档。关键是,它们通过“&$item1”(第一个示例中的函数“test_alter”)保存编辑的值。
我认为,如果您在“fix\u output”函数的末尾添加一个“var\u dump($new\u array)”,它将显示您想要的内容。回调不会返回任何内容,返回值也不会更改值
如果要更改值,请将参数声明为引用(&$value
),并在回调结束时重新分配变量
工作示例:
或者,您可以重新计算并使用数组映射
,这将创建并返回一个新数组
<?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\u 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.*
函数,这样您就可以看到如果将它们结合起来,它的功能会有多强大。也不是如何使用range()
构建初始良好数组(还可以检查array\u fill\u keys
)。此外,还可以返回$value
并使用数组映射()
返回一个新数组。@abracadver是的,我也会转到数组映射()
。但在这种情况下,问题是array\u walk
。这真的帮助了我!我应该经常仔细检查手册,查看每一个细节。这对我真的很有帮助@yowza我在结尾添加了一个更紧凑的版本,我很感激@michael!
<?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);
<?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
)