2010-06-23 5 views
4

J'ai un tableau multidimensionnel avec des chaînes comme clés. Je veux exécuter une fonction (pour manipuler les chaînes) sur ces clés, puis écrire dans un nouveau tableau (c'est-à-dire laisser le tableau original inchangé).PHP: renommer les clés d'un tableau multidimensionnel

Exemple:

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

Devient:

 
$newArr = array(
    "foo_new" => array("moo_new" => 1234, "woo_new" => 5678); 
    "bar_new" => array("car_new" => 4321, "tar_new" => 8765); 
); 

Ceci est juste un exemple, le tableau réel a plus de niveaux/dimensions. Oh et ma fonction ne remplace pas "_old" par "_new", encore une fois, juste un exemple.

J'espère que j'ai fait un peu de sens, merci d'avance!

+0

est-ce que oyu veut remplacer toutes les clés en général ou seulement les touches spéciales? – Thariama

+0

Je veux remplacer toutes les clés, oui. (C'est-à-dire, en appliquant ma fonction() à chaque clé de tableau) Désolé de ne pas être assez clair. – user367217

Répondre

0

Quelque chose comme ceci:

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

Excepté le PO ne veut pas changer le tableau original, donc vous voudrez retourner plutôt qu'utiliser une référence. L'autre option serait d'assigner le nouveau avant d'appeler la fonction. – Joseph

+0

-1 cela va produire un tableau contenant les anciennes valeurs aussi – Thariama

+0

@Joseph: right :) –

1

Modifier: J'ai ajouté une fonction pour imprimer le tableau a changé. Vous pouvez inclure le code sur un site Web et il affichera le résultat. Nouveau code édité:

// 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

vous voudrez peut-être choisir un autre nom de fonction en raison de http://de2.php.net/manual/fr/function.rename.php – Gordon

+0

Ceci: "Sauf que l'OP ne veut pas changer le tableau d'origine, alors vous voulez revenir plutôt que d'utiliser une référence. " – user367217

+0

a copié le tableau – Thariama

1

Je suis probablement un peu en retard, mais la récursivité est la voie à suivre!

$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

Version de fermeture. Cela ne gâche pas l'espace de noms.

<?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)); 
Questions connexes