2010-06-23 78 views
4

我有一个多维数组作为键的字符串。我想在这些键上执行一个函数(来操作字符串),然后写入一个新的数组(即保持原始数组不变)。PHP:重命名多维数组的键

实施例:

 
$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”,这只是一个例子。

我希望我有所作为,提前致谢!

+0

do oyu想要替换所有的键一般还是只是特殊键? – Thariama 2010-06-23 14:09:52

+0

我想替换所有的键,是的。 (即,将我的函数()应用于每个数组键)对不起,不够清晰。 – user367217 2010-06-23 14:18:46

回答

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 2010-06-23 14:10:39

+0

-1这将产生一个包含旧值的数组 – Thariama 2010-06-23 14:12:27

+0

@Joseph:right :) – 2010-06-23 14:13:47

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 2010-06-23 14:24:01

+0

这:“除了OP不想更改原始数组,所以你会想要返回而不是使用参考。“ – user367217 2010-06-23 14:37:39

+0

复制了数组 – Thariama 2010-06-23 14:55:32

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