递归地从键中左侧修剪特定字符

9

我有点搞不清楚这个...

我本来希望有一个默认的PHP函数可以做到这一点,但似乎没有。我在网上找到的代码似乎并不适用于我的情况,因为人们通常只需要修改数组值而不是它们的键。

我需要一个递归函数,将以“_”开头的每个键都替换为没有该符号的同名键....

这里有没有人使用过类似的东西?

2个回答

23

试试这个:

function replaceKeys(array $input) {

    $return = array();
    foreach ($input as $key => $value) {
        if (strpos($key, '_') === 0)
            $key = substr($key, 1);

        if (is_array($value))
            $value = replaceKeys($value); 

        $return[$key] = $value;
    }
    return $return;
}

所以这段代码:

$arr = array('_name' => 'John', 
             'ages'  => array(
                  '_first' => 10, 
                  'last'   => 15));

print_r(replaceKeys($arr));

将会生成以下内容(如在 codepad 中看到):

Array
(
    [name] => John
    [ages] => Array
        (
            [first] => 10
            [last] => 15
        )

)

-1
使用 PHP 的本地 array_walk_recursive() 这似乎是一个更干净的解决方案,其中在回调函数中将 $key 作为参考传递,如下所示:
array_walk_recursive($your_array, function ($item, &$key) {
    if (strpos($key, '_') === 0) {
        $key = substr($key, 1);
    }
});

1
不可能的:https://www.php.net/manual/en/function.array-walk.php#45380 - David Pauli
如果目标键不属于“叶节点”,则此方法将无法正常工作。 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接