PHP-код работает, пока я не сделаю его функцией - PullRequest
3 голосов
/ 10 июня 2011

У меня есть этот код, который дает мне искомый результат, красиво отформатированное дерево значений.

<code>    $todos = $this->db->get('todos'); //store the resulting records
    $tree = array();                  //empty array for storage
    $result = $todos->result_array(); //store results as arrays

    foreach ($result as $item){
        $id = $item['recordId'];
        $parent = $item['actionParent'];
        $tree[$id] = isset($tree[$id]) ? $item + $tree[$id] : $item;
        $tree[$parent]['_children'][] = &$tree[];
    }

    echo '<pre>';
    print_r($tree);
    echo '
';

Когда я помещаю код из foreach в такую ​​функцию, я получаю пустой массив. Чего мне не хватает?

<code>    function adj_tree($tree, $item){
        $id = $item['recordId'];
        $parent = $item['actionParent'];
        $tree[$id] = isset($tree[$id]) ? $item + $tree[$id] : $item;
        $tree[$parent]['_children'][] = &$tree[];
    }

    $todos = $this->db->get('todos'); //store the resulting records
    $tree = array();                  //empty array for storage
    $result = $todos->result_array(); //store results as arrays

    foreach ($result as $item){
        adj_tree($tree, $item);
    }

    echo '<pre>';
    print_r($tree);
    echo '
';

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Самый простой способ - передать $tree в функцию по ссылке .Попробуйте изменить следующую строку в вашем коде

function adj_tree($tree, $item)

на

function adj_tree(&$tree, $item)

Это потому, что в вашем коде $tree передается внутри функции adj_tree как копияоригинал $tree.Когда вы передаете по ссылке, оригинал передается, и изменения в нем с помощью функции adj_tree отражаются после вызова.

A секунда (не предпочтительно) альтернатива для вашей функциичтобы вернуть измененное дерево, чтобы ваша функция выглядела следующим образом:

function adj_tree($tree, $item) {
        $id = $item['recordId'];
        $parent = $item['actionParent'];
        $tree[$id] = isset($tree[$id]) ? $item + $tree[$id] : $item;
        $tree[$parent]['_children'][] = &$tree[];
        return $tree; // this is the line I have added
}

И ваш цикл foreach будет выглядеть так:

foreach ($result as $item){
    $tree = adj_tree($tree, $item);
}
2 голосов
/ 10 июня 2011

Прямо сейчас функция создает локальную копию {$ tree}, редактирует ее и затем отбрасывает эту копию при закрытии функции.

У вас есть два варианта:

1) returnлокальную копию {$ tree} и назначьте ее глобальной копии.

function adj_tree($tree, $item){
    $id = $item['recordId'];
    $parent = $item['actionParent'];
    $tree[$id] = isset($tree[$id]) ? $item + $tree[$id] : $item;
    $tree[$parent]['_children'][] = &$tree[];
    return $tree;
}
//...
foreach ($result as $item){
    $tree = adj_tree($tree, $item);
}

2) передайте массив по ссылке и отредактируйте глобальную версию в функции.

function adj_tree(&$tree, $item){
    $id = $item['recordId'];
    $parent = $item['actionParent'];
    $tree[$id] = isset($tree[$id]) ? $item + $tree[$id] : $item;
    $tree[$parent]['_children'][] = &$tree[];
}
0 голосов
/ 10 июня 2011

попробуйте это:

function adj_tree($tree, $item){
    global $tree;
    // ...

или

function adj_tree(&$tree, $item){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...