2010-06-23 117 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));