从数组中的所有元素中删除不需要的字符


Remove unwanted characters from all elements in an array

我有这个功能可以去除非法字符,并且工作正常。

这是代码。

<?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 ',
)