2010-11-12 205 views
1

我有以下的PHP函數問題PHP參考

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; 
} 

功能應該允許我在任何層次(即嵌套組)創建「組」。

什麼似乎是問題是PHP處理引用的方式。 當我發送類似ar_path('level 1','level 2')的東西時,函數應該創建一個「1級」的子組(如果它不存在)。

因此給出的是這樣的:

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

我喜歡的東西最終會:

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

的問題是,在我的第二次通過循環,當我運行線/*MARKER*/到創建第二級(即應該導致在$this->ma_config['groups']['level 1]['groups']['level 2'] = array())它摧毀'1級',而不是(從調試器,似乎PHP最終這樣做,而不是$this->ma_config['groups']['level 1] = array()

爲什麼?

+0

我測試了你的代碼,它的工作原理就像它應該...你可以將你的調用發佈到'__group'來查看你傳遞的參數嗎? – netcoder 2010-11-12 14:53:25

回答

0

我不確定你的功能在做什麼,因爲它有多複雜。考慮使用這個簡單的代碼來擴充你的數據結構。然後,將任何操作或外觀分離到不同的功能中。

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