在TL的情况下; DR:建立与引用数组,然后改变所述阵列的一个副本仍然保留的引用和所有副本的元件在同一时间被改变。 需要与它指向的值替换参考的解决办法。
我得到一个复杂的问题,在PHP中使用数组引用:(
我有两个属性独特元件的扁平阵列:顺序和水平。 为了表示从1到n的内容的方式如表元素的顺序号。 程度代表元件是电平“子章节”。
实施例:第一托架是它们是随机的,但是唯一的元素ID:
[1][order:1][level:1]
----[7][order:2][level:2]
----[4][order:3][level:2]
---- ----[2][order:4][level:3]
[3][order:5][level:1]
[6][order:6][level:1]
----[5][order:7][level:2]
.
.
.
记住,这是元素的扁平阵列,高于其只是一个视觉表示。 现在,我试图把它们变成阵列形式的:
[1][children] => [
[7],
[4][children] => [
[2]
]
]
[3],
[6][children] => [
[5]
]
这将是一个树形结构-ish ..
我这样做是由第一顺序,命令他们:
foreach($elements as $element){
$ordered_elements[$element['order']] = $element;
}
然后我转移正确的父下的每个元素:
foreach($ordered_elements as &$child){
if($child['level'] > 1){
$ordered_elements[$last_parent[$child['level']-1]]['children'][$child['content_id']] = &$child; // I think this is problematic line!!!
}
$last_parent[$child['level']] = $child['sort_order'];
}
一些元件的留在根(第一)级的是不应该是有:
foreach($ordered_elements as &$child){
if($child['level'] == 1){
$ordered_elements[$child['content_id']] = $child;
}
unset($ordered_elements[$child['sort_order']]);
}
现在,当做到这一点,样板阵列已准备就绪。 现在,我开始从element_id和user_ID的查询得到了一些数据。
我想建立一个新的表“用户”,将有此以前所做的每个用户阵列和我将能够改变每个用户的元素。
users[1]['elements'] = $ordered_elements;
users[2]['elements'] = $ordered_elements;
此功能应参照从用户自己的元素池归元,让我们可以直接把它变成用户[X] [“元素”] [X]:
function &get_element_from_array(&$array, $searchValue){
$status = false;
foreach($array as $id => &$subtree) {
if ($id === $searchValue) {
return $subtree;
}
if (isset($subtree['children'])) {
$subsearch = &$this->get_element_from_array($subtree['children'], $searchValue);
if ($subsearch != false) {
return $subsearch;
}
}
}
return $status;
}
这意味着,如果我想从用户2,我需要调用它改变元件5:
$element = &get_element_from_array(users[2]['elements'], 5);
$element['visited'] = true;
这是发生问题:我刚改变该元素中的元素的用户2和用户1阵列。
我希望太长,我没有写这个东西,是去为好解释。