我有以下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 :(得分: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);