【问题标题】:Recursively change keys in array递归更改数组中的键
【发布时间】:2012-08-16 18:53:10
【问题描述】:

我有这个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';

【问题讨论】:

  • 更改键名可能很危险。假设$_POST 数组中有两个键,一个名为My Data,另一个名为My_Data。您必须弄清楚如何处理潜在的密钥冲突。此外,后面的逻辑可能依赖于来自$_POST 的键与某些 HTML 控件匹配。如果您即时更改键,则该逻辑可能会中断。
  • Web 浏览器将 转换为 $_POST['Word_word']... 如果我有两个 Word wordWord_word,无论如何都会有冲突...

标签: php recursion


【解决方案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

【讨论】:

    【解决方案2】:

    这是一个老歌,但我只是在相关方面看到它:

    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()

    【讨论】:

    • array_walk_recursive() 会错过不属于叶子节点的键,对吧?
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2015-11-06
    • 2015-09-05
    • 2015-07-03
    • 1970-01-01
    • 2019-08-01
    • 2011-04-27
    • 2020-05-04
    相关资源
    最近更新 更多