2009-12-29 4 views
0

Voici mon precode ...ajouts clés de tableau dynamique

$keys = array('a', 'b', 'c', 'd'); 
$number = 10; 

Et voici mon code ...

eval('$array[\''.implode('\'][\'',$keys).'\'] = $number;'); 

Avec cela, j'obtenir le résultat suivant ...

Array (
    [a] => Array 
     (
      [b] => Array 
       (
        [c] => Array 
         (
          [d] => 10 
         ) 
       ) 
     ) 
) 

Maintenant, le problème est que c'est le résultat exact que je veux, mais je ne veux pas utiliser eval(). En entrée de mon code, j'ai une liste de keys et un number. Le number doit être défini sur la valeur du tableau keys utilisé pour générer keys pour un certain tableau $array.

Existe-t-il une façon différente de réaliser cela? Je ne veux pas écraser les clés/numéros avec de nouvelles valeurs que le code fonctionne - eval() conserve déjà cela, donc mon nouveau code devrait faire la même chose.

+0

Il y a un point où je dois demander pourquoi dans le monde que vous » Je fais ça avant de répondre à la question. Pourquoi voudriez-vous cette structure? Et est-ce qu'une structure aussi rigide endommage réellement votre projet? Sûrement il doit y avoir de meilleures méthodes de stockage existantes? –

+0

Je devrais passer environ une heure à rédiger l'explication complète de la situation unique qui s'est produite pour cette exigence. Pardon. – onassar

Répondre

1

Voici un exemple de code complet montrant comment cela fonctionnerait. Ce qui est important est que vous utilisez une référence au tableau afin que vous pouvez le modifier:

<?php 
    $keys = array('a', 'b', 'c', 'd'); 
    $number = 10; 

    $org_array = array(
     "a" => "string", 
     "z" => array("k" => false) 
    ); 

    function write_to_array(&$array, $keys, $number){ 
     $key = array_shift($keys); 
     if(!is_array($array[$key])) $array[$key] = array(); 
     if(!empty($keys)){ 
     write_to_array($array[$key], $keys, $number); 
     } else { 
     $array[$key] = $number; 
     } 
    } 

    write_to_array($org_array, $keys, $number); 

    print_r($org_array); 
?> 
+0

ceux-ci le plus proche, mais encore une fois, ne fonctionne pas dans le cas où le tableau est: array ('a' => 'meow') et le tableau de clés est: array ('a' , 'avant JC'). Je reçois une erreur fatale: Seules les variables peuvent être transmises par référence ... – onassar

+0

@onassar J'ai mal compris ce que vous vouliez dire par les valeurs précédentes.J'ai mis à jour deux parties dans le code, le '$ org_array ['a']' est maintenant défini sur une chaîne à tester, et j'ai changé le test 'isset' en un test' is_array'. Maintenant, si la clé existe comme autre chose qu'un tableau, elle est écrasée ou étendue. –

+0

vous = moi héros. Merci Monsieur. – onassar

3

S'il vous plaît noter que le code ci-dessous (que vous évaluez) va générer un avertissement, et ne fonctionnera donc pas sur des projets avec les rapports d'erreurs au max:

$array = array(); 
$array['a']['b'] = 42; // $array['a'] is not an array... yet 

Puisque vous utilisez PHP 5, vous pouvez travailler avec des références pour manipuler votre tableau en traversant la branche de votre arbre que vous souhaitez modifier.

$current = & $array; 

foreach ($keys as $key): 

    if (!isset($current[$key]) || !is_array($current[$key])) 
    $current[$key] = array(); 

    $current = & $current[$key]; 

endforeach; 

$current = $value; 

Modifier: corrigé pour éviter les avertissements et les conflits.

+0

Alors pourquoi ne lance-t-il pas une erreur sur le second tour où vous définissez effectivement $ array ['a'] = $ array ['b'] 'puisque' a' n'est pas encore un tableau non plus. Quoi qu'il en soit, +1 car cela fonctionne très bien et est beaucoup plus court que ma réponse. –

+1

premièrement, quelle erreur génère-t-elle? J'ai mes rapports au maximum, y compris les avertissements de dépréciation, et je ne vois rien. votre code fonctionne pour les cas où tableau est vide ou avec des clés qui ne sont pas un conflit potentiel. mais si le tableau ressemble à ceci: array ('a' => 'b') et les clés ressemblent à ce tableau ('a', 'orange') J'obtiens: Erreur fatale: Impossible de créer des références vers/depuis les offsets de chaînes ni les objets surchargés dans ... – onassar

1
function deepmagic($levels, $value) 
{ 
    if(count($levels) > 0) 
    { 
     return array($levels[0] => deepmagic(array_slice($levels, 1), 
      $value)); 
    } 
    else 
    { 
     return $value; 
    } 
} 

$a = deepmagic(Array('a', 'b', 'c', 'd'), 10); 

var_dump($a); 

Sortie:

array(1) { 
    ["a"]=> 
    array(1) { 
    ["b"]=> 
    array(1) { 
     ["c"]=> 
     array(1) { 
     ["d"]=> 
     int(10) 
     } 
    } 
    } 
} 
+0

Celui-ci ne fonctionne pas pour les tableaux avec des clés/valeurs existantes non plus. Hmmm. – onassar

+0

Utilisez ensuite array_keys() ou array_values ​​() avant de passer le tableau. –