Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何用元素的值替换对元素的引用?_Php_Arrays_Recursion_Reference - Fatal编程技术网

Php 如何用元素的值替换对元素的引用?

Php 如何用元素的值替换对元素的引用?,php,arrays,recursion,reference,Php,Arrays,Recursion,Reference,在tl的情况下;dr:使用引用设置数组,然后更改所述数组的副本仍然保留引用,同时更改所有副本的元素。需要一种变通方法,用引用所指向的值替换引用 我在PHP数组中使用引用时遇到了一个复杂的问题:( 我有一个唯一元素的平面数组,具有两个属性:顺序和级别。 顺序表示元素的顺序号,从1到n,以类似的目录方式。级别表示元素的“子章”级别 例如: 第一个括号是随机但唯一的元素ID: [1][order:1][level:1] ----[7][order:2][level:2] ----[4][order:3

在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']]);
}
完成后,模板数组就准备好了。现在,我开始从查询中获取一些数据,其中包含元素id和用户id

我想建立一个新的表“users”,它将为每个用户创建一个数组,并且我将能够更改每个用户的元素

users[1]['elements'] = $ordered_elements;
users[2]['elements'] = $ordered_elements;
此函数应通过引用从用户自己的元素池返回元素,因此我们可以直接将其更改为用户[x]['elements'][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;
这就是问题所在:我刚刚在user2和user1元素数组中更改了这个元素

我希望我没有把这件事写得太长,是为了得到好的解释