2011-09-22 5 views
6

J'ai une chaîne comme ceci:clés de tableau dynamique

$string = 'one/two/three/four';

que je transformer en un tableau:

$keys = explode('/', $string);

Ce tableau peut avoir un certain nombre d'éléments, comme 1 , 2, 5 etc.

Comment puis-je affecter une certaine valeur à un tableau multidimensionnel, mais utilisez le $keys que j'ai créé ab ove pour identifier la position où insérer?

Comme:

$arr['one']['two']['three']['four'] = 'value';

Désolé si la question est source de confusion, mais je ne sais pas comment l'expliquer mieux

Répondre

13

C'est une sorte de non-trivial parce que vous voulez nid, mais il devrait aller quelque chose comme:

function insert_using_keys($arr, $keys, $value){ 
    // we're modifying a copy of $arr, but here 
    // we obtain a reference to it. we move the 
    // reference in order to set the values. 
    $a = &$arr; 

    while(count($keys) > 0){ 
     // get next first key 
     $k = array_shift($keys); 

     // if $a isn't an array already, make it one 
     if(!is_array($a)){ 
      $a = array(); 
     } 

     // move the reference deeper 
     $a = &$a[$k]; 
    } 
    $a = $value; 

    // return a copy of $arr with the value set 
    return $arr; 
} 
1

Vous devrez d'abord vous assurer que les clés existent, puis attribuer la valeur. Quelque chose comme cela devrait fonctionner (non testé):

function addValueByNestedKey(&$array, $keys, $value) { 
    $branch = &$array; 
    $key = array_shift($keys); 
    // add keys, maintaining reference to latest branch: 
    while(count($keys)) { 
     $key = array_pop($keys); 
     if(!array_key_exists($key, $branch) { 
      $branch[$key] = array(); 
     } 
     $branch = &$branch[$key]; 
    } 
    $branch[$key] = $value; 
} 

// usage: 
$arr = array(); 
$keys = explode('/', 'one/two/three/four'); 

addValueByNestedKey($arr, $keys, 'value'); 
1

il est ringard, mais:

function setValueByArrayKeys($array_keys, &$multi, $value) { 
    $m = &$multi 
    foreach ($array_keys as $k){ 
     $m = &$m[$k]; 
    } 
    $m = $value; 
} 
+0

Cela ne fonctionnera pas. '$ multi = $ multi [$ k]' crée une * copie *, ce n'est pas une référence, donc vous ne modifiez rien quand vous faites '$ multi = $ value', excepté le tableau final. –

+0

vient de l'éditer. – MattoTodd

+0

il * encore * ne fonctionnera pas, vous créez * des copies *, pas * des références *. –

5
$string = 'one/two/three/four'; 
$keys = explode('/', $string); 
$arr = array(); // some big array with lots of dimensions 
$ref = &$arr; 

while ($key = array_shift($keys)) { 
    $ref = &$ref[$key]; 
} 

$ref = 'value'; 

Ce que cela fait:

  • Utilisation d'une variable, $ref, de garder une trace d'une référence à la dimension actuelle de $arr.
  • Boucle passant par $keys un par un, en faisant référence à l'élément $key de la référence actuelle.
  • Définition de la valeur à la référence finale.
+0

Je reçois une "connexion fermée par le serveur" quand j'essaye ceci :) – Alex

+0

ok maintenant ça marche: D – Alex

+0

Et si '$ keys' contient 0 ou NULL? –