使用数组walk来删除非法字符

时间:2016-02-17 02:35:29

标签: 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 = 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)时,它并没有删除非法字符。 这似乎是什么问题?任何想法都会有所帮助! 请指出不清楚的事情!

3 个答案:

答案 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)。