2010-11-12 92 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);