1

私はこのtrimmer関数を持っています、それは配列内のすべての値を再帰的にトリミングします(人々は理由もなくたくさんのスペースを入れます!):

function trimmer(&$var) {
    if (is_array($var)) {
        foreach($var as &$v) {
            trimmer($v);
        }
    }
    else {
        $var = trim($var);
    }
}
trimer($_POST);

問題:新しい機能を追加したい:この関数_でキー内のすべて(アンダースコア)をスペースに変換したい。キー()を変換する方法は知っていますstr_replace('_', ' ', $key)が、この再帰的なスタイルで機能させるのに問題があります...

入力:

$_POST['Neat_key'] = '   dirty value ';

期待される結果:

$_POST['Neat key'] = 'dirty value';
4

2 に答える 2

1

残念ながら、配列をループしている間に配列のキーを置き換える方法はありません。これは言語の一部であり、それを回避する唯一の方法は一時配列を使用することです。

$my_array = array(
    'test_key_1'=>'test value 1     ',
    'test_key_2'=>'        omg I love spaces!!         ',
    'test_key_3'=>array(
        'test_subkey_1'=>'SPPPPAAAAACCCEEESSS!!!111    ',
        'testsubkey2'=>'    The best part about computers is the SPACE BUTTON             '
    )
);
function trimmer(&$var) {
    if (is_array($var)) {
        $final = array();
        foreach($var as $k=>&$v) {
            $k = str_replace('_', ' ', $k);
            trimmer($v);
            $final[$k] = $v;
        }
        $var = $final;
    } elseif (is_string($var)) {
        $var = trim($var);
    }
}
/* output
array (
        'test key 1'=>'test value 1',
        'test key 2'=>'omg I love spaces!!',
        'test key 3'=>array (
                'test subkey 1'=>'SPPPPAAAAACCCEEESSS!!!111',
                'testsubkey2'=>'The best part about computers is the SPACE BUTTON'
        )
)
*/

試してみてください:http://codepad.org/A0N5AU2g

于 2012-08-16T19:09:20.940 に答える
0

これはオールディーズですが、私はそれを関連して見ました:

function trimmer(&$var) {
    if (is_array($var)) {
        foreach($var as &$v) {
            trimmer($v);
        }
        // only additional code
        $var = array_combine(str_replace('_', ' ', array_keys($var)), $var);
    }
    else {
        $var = trim($var);
    }
}

しかし、最近はarray_walk_recursive()の方が適しています。

于 2015-04-02T20:34:39.363 に答える