2011-06-10 5 views
3

이 코드는 제가 찾고있는 결과를 제공합니다. 멋지게 형식화 된 값 트리입니다.PHP 코드는 함수가 될 때까지 작동합니다.

$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 '</pre>'; 

foreach의 코드를 이와 같이 함수에 넣으면 빈 배열이 생깁니다. 내가 뭘 놓치고 있니?

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

또는

function adj_tree(&$tree, $item){ 

답변

2

지금이 함수는 {$ tree}의 로컬 복사본을 만들고 편집 한 다음 함수가 닫히면 해당 복사본을 버립니다.

1) {$ 나무}의 로컬 복사본을 반환 글로벌 사본에 할당 :

당신은 두 가지 옵션이 있습니다.

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

그렇게 했으니까요. – Chris

0

이 시도. 원래 $tree의 사본으로 기능 adj_tree 내부에 전달되는 때문에 코드 $tree

function adj_tree(&$tree, $item) 

이것은 당신의 코드

function adj_tree($tree, $item) 

에 다음 줄을 변경하십시오. 참조로 전달하면 원래의 값이 전달되고 호출 후에는 adj_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; // this is the line I have added 
} 

그리고 당신의 foreach 루프 :

(권장하지 않음) 대안으로 볼 것이다 당신의 기능은 다음과 있도록 수정 된 트리를 반환하는 함수입니다

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

가장 쉬운 방법 기능 by reference$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[]; 
    } 

    $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 '</pre>'; 
관련 문제