PHP:重命名多维数组的键

4
我有一个多维数组,其键为字符串。我想对这些键执行一个函数(以操作字符串)然后写入一个新数组(即保留原数组不变)。
示例: $oldArr = array( "foo_old" => array("moo_old" => 1234, "woo_old" => 5678); "bar_old" => array("car_old" => 4321, "tar_old" => 8765); );
变成: $newArr = array( "foo_new" => array("moo_new" => 1234, "woo_new" => 5678); "bar_new" => array("car_new" => 4321, "tar_new" => 8765); );
这只是一个例子,实际数组具有更多的层/维度。而且我的函数不会用"_new"替换"_old",这只是一个例子。希望能帮到您!

你想要替换所有键还是只替换特定的键? - Thariama
我想要替换所有的键,是的。(也就是将我的function()应用于每个数组键)抱歉没有表达清楚。 - user367217
4个回答

1

我可能有点晚,但是递归是解决这个问题的方法!

$replace_from = "_old"; //can also be array i.e. array("foo_old", "bar_old")
$replace_to = "_new"; //can also be an array i.e. array("foo_new", "bar_new")

$oldArr = array(
    "foo_old" => array("moo_old" => 1234, "woo_old" => 5678),
    "bar_old" => array("car_old" => 4321, "tar_old" => 8765),
);

function replace($arr){
    global $replace_from, $replace_to;
    $newArr = array();
    foreach($arr as $key => $value){
        $newArr[str_replace($replace_from,$replace_to,$key)] = (is_array($value)) ? replace($value) : $value;
    }
    return $newArr;
}

print_r (replace($oldArr));

1

编辑:我添加了一个打印修改后数组的函数。您可以将代码包含在网站上,它将显示结果。新编辑的代码:

// array initialisation
oldArr = array();
$subArr1 = array();
$subArr2 = array();

$subArr1["moo_old"]=1234;
$subArr1["woo_old"]=5678;
$subArr2["car_old"]=4321;
$subArr2["tar_old"]=8765;
$oldArr["foo_old"]=$subArr1;
$oldArr["bar_old"]=$subArr2;

$oldArr;  // make a copy of the array

// function which replaces recursivly the keys of the array 
function renameArrayKeys( $oldArr ) {

 $copyArr = $oldArr;

    if( is_array( $oldArr) && count( $oldArr ) ) {
        foreach ( $oldArr as $k => $v ) {

            unset($copyArr[$k]); // removes old entries
            $newKey = str_replace( '_old', '_new', $k );

            if( is_array( $v ) ) {
    $copyArr[ $newKey ] = renameArrayKeys( $v );
            }
            else {
             $copyArr[ $newKey ] = $v;
            }
        }
        return $copyArr;
    }
}

// prints out the keys and values of the changed array
function printout($arr ){
 foreach ($arr as $k => $val ) {
  echo $k."=>".$val." | ";
  if( is_array( $val ) ) {
             printout( $val );
  }
 }
}

// calls the above functions
$changedArr = renameArrayKeys($oldArr);
printout($changedArr);

1
你可能需要选择另一个函数名,因为http://de2.php.net/manual/en/function.rename.php。 - Gordon
除非 OP 不想改变原始数组,否则您将需要返回而不是使用引用。 - user367217
我收到了一个“致命错误:myscript.php第100行超过30秒的最大执行时间”的消息,第100行是:“if(is_array($arr)&& count($arr)){”。可能出了什么问题? - user367217
你需要初始化 $arr_orig - 我会将这个添加到代码中。 - Thariama
还是一样的。你真的测试过吗? - user367217
好的,我已经完成了 - 我会再次检查。 - Thariama

0

闭包版本。这不会弄乱命名空间。

<?php

$from = '_old';
$to   = '_new';

$old_arr = array(
    'foo_old' => array('moo_old' => 1234, 'woo_old' => 5678),
    'bar_old' => array('car_old' => 4321, 'tar_old' => 8765),
);

$func = function ($arr) use (&$func, $from, $to) {
    $new_arr = array();
    foreach($arr as $k => $v){
        $new_arr[str_replace($from, $to, $k)] = is_array($v) ? $func($v) : $v;
    }
    return $new_arr;
};

print_r($func($old_arr));

0

类似这样:

function renameKeys( $arr ) 
{
    if( is_array( $arr ) && count( $arr ) ) {
            foreach ( $arr as $k => $v ) {
                $nk = str_replace( '_old', '_new', $k );
                if( is_array( $v ) ) {
                    $v = renameKeys( $v );
                }
                $arr[ $nk ] = $v;
                unset( $arr[$k] );
            }
    }
    return $arr;
}
$oldArr = array(
    "foo_old" => array("moo_old" => 1234, "woo_old" => 5678) ,
        "bar_old" => array("car_old" => 4321, "tar_old" => 8765)
        );

$nArr = renameKeys( $oldArr );
print_r( $nArr );

1
除非 OP 不想更改原始数组,否则您将希望返回而不是使用引用。另一个选项是在调用函数之前分配新的。 - Joseph
你修改了函数,但现在什么都没有改变! - Thariama
函数可以正常工作,但是如果$nk将与$k相同(在对$k应用函数后,例如$nk = strtolower($k)),则它会跳过该键并不将其添加到$arr中。您有解决方法吗?谢谢。 - user367217

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