2010-11-12 3 views
1

J'ai la fonction PHP suivanteavec PHP Références

protected function &__group($ar_path, $b_create) { 
    assert('is_null($ar_path) || is_array($ar_path)'); 
    $parent = &$this->ma_config; 

    if (!is_null($ar_path) && (count($ar_path) > 0)) { 
     if ($b_create) { 
      // Get with Create is necessary 
      foreach ($ar_path as $group) { 
       if (!array_key_exists('groups', $parent)) { 
     /*MARKER*/ $parent['groups'] = array($group => array()); 
        // Mark the File as Modified 
        $this->mb_dirty = true; 
        continue; 
       } 

       $parent = &$parent['groups']; 
       if (!array_key_exists($group, $parent)) { 
        $parent[$group] = array(); 
        // Mark the File as Modified 
        $this->mb_dirty = true; 
        continue; 
       } 

       $parent = &$parent[$group]; 
      } 
     } else { 
      // Simple Get 
      foreach ($ar_path as $group) { 
       $parent = array_extract_key(
        array('groups', $group), 
        $parent, 
        'is_array' 
       ); 
       if (is_null($parent)) { 
        break; 
       } 
      } 
     } 
    } 
    return $parent; 
} 

La fonction est censé me permettre de créer des « groupes » à tous les niveaux (à savoir les groupes imbriqués).

Ce qui semble être le problème, c'est la façon dont PHP gère les références. Lorsque j'envoie quelque chose comme ar_path('level 1','level 2'), la fonction doit créer un groupe enfant au niveau 1 s'il n'existe pas.

quelque chose comme donc donné:

$this->ma_config = array(
    'groups' => array(
     'level 1' => array(
      'values' => array(
       '1', 
       '2' 
      ) 
     ) 
    ) 
); 

je finir avec quelque chose comme:

$this->ma_config = array(
    'groups' => array(
     'level 1' => array(
      'groups' => array(
       'level 2' => array() 
      ), 
      'values' => array(
       '1', 
       '2' 
      ) 
     ) 
    ) 
); 

Le problème est que, sur mon second passage dans la boucle, quand je lance la ligne /*MARKER*/ à créer le deuxième niveau (ie qui devrait avoir abouti à $this->ma_config['groups']['level 1]['groups']['level 2'] = array()) il détruit le 'niveau 1' à la place (il semble, à partir du débogueur, que PHP finisse par le faire à la place $this->ma_config['groups']['level 1] = array())

Pourquoi?

+0

J'ai testé votre code, et cela fonctionne comme il se doit ... Pouvez-vous envoyer votre appel à '__group' pour voir quels paramètres vous le transmettez? – netcoder

Répondre

0

Je ne suis pas vraiment sûr de ce que fait votre fonction en raison de sa complexité. Envisagez d'utiliser ce code simple pour augmenter votre structure de données. Ensuite, séparez toutes les opérations ou recherchez dans une fonction différente.

<?php 

$ma_config = array(
    'groups' => array(
     'level 1' => array(
      'values' => array(
       '1', 
       '2' 
      ) 
     ) 
    ) 
); 

$ar_path = 'level 1'; 
$b_create = 'level 2'; 

$newGroup =& $ma_config['groups'][$ar_path]['groups'][$b_create]; 
$newGroup = (array) $newGroup; 
unset($newGroup); 

print_r($ma_config); 
Questions connexes