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 
)