0

親要素のすべての子を再帰的に返すPHP関数が必要ですが、返された子を配列の親内に取得しようとすると、エラーが発生するか、子が配列のルートレベルに追加されました。この関数を変更して、子配列の親要素内に子要素を挿入するにはどうすればよいですか??

public function getAllChilds($Parent_ID, $level_identifier="", $start=true) { // get     all the childs of all the levels under a parent as a tree      
        $immediate_childs=$this->getImmediateChilds($Parent_ID,  $this-    >extra_condition, $this->order_by_phrase);
        if(count($immediate_childs)) {
            foreach($immediate_childs as $chld) {
                $chld[$this->item_list_field_name]=$level_identifier.$this->item_pointer.$chld[$this->item_list_field_name];
                array_push($this->all_childs,$chld);
                $this->getAllChilds($chld[$this->item_identifier_field_name], ($level_identifier.$this->level_identifier), false);
            }
        }
        if($start) {
            return $this->all_childs; 
        }
    } 

private function getImmediateChilds($parent_identifier_field_value, $extra_condition="", $order_by_phrase="") { // get only the direct/immediate childs under a parent 
    $sql="SELECT * FROM `".$this->db_table."` WHERE `".$this->parent_identifier_field_name."`='".$parent_identifier_field_value."' ".$extra_condition." ".$order_by_phrase;
    $res=mysql_query($sql);
    $childs=array();
    while($val=mysql_fetch_assoc($res)) {
        array_push($childs,$val);
    }
    return $childs; 
}

この行は子を配列内に挿入するものですが、子を親内に挿入して、子を配置する親内のターゲット配列である children という別の配列要素を追加して、返された要素..

array_push($this->all_childs,$chld);

助けてください!!この関数の目的は、JSON ツリーに変換されるマルチレベル配列ツリーを最終的に返すことです。

ありがとう

これは完全なクラス コードです。

<?php   
class ParentChild { 

    //properties which hold database and table related information  : start     
    var $db_host;
    var $db_user;
    var $db_pass;
    var $db_database;
    var $db_table; 


    var $item_identifier_field_name;  //may be the primary key of the table : as decided by the db designer 
    var $parent_identifier_field_name; //the fileld name in the table which holds the value of the item_identifier_field_name any item's parent : as decided by the db designer
    var $item_list_field_name; //field name in the table whose value will be shown in the list or tree (like name or any id etc.) : as choosen by the programmer 

    var $extra_condition="";  //if any extra condition should be added with the query : as desided by the programmer 
    var $order_by_phrase="";  //if any order by phrase should be added with the query : as desided by the programmer 
    //properties which hold database and table related information  : end



    var $level_identifier = "  ";  //no. of level of any item as per the generated tree : it will appear number of level times before the item in the list/tree
    var $item_pointer = "|-"; 



    var $all_childs = array(); //contains the entire tree or list starting from a given root element

    var $item_path = array(); //contains the total path of a given element/node(the list of elements starting from the top level root node to the given element/node)

    public function getAllChilds($Parent_ID, $level_identifier="", $start=true) { // get all the childs of all the levels under a parent as a tree      
        $immediate_childs=$this->getImmediateChilds($Parent_ID,  $this->extra_condition, $this->order_by_phrase);
        if(count($immediate_childs)) {
            foreach($immediate_childs as $chld) {
                $chld[$this->item_list_field_name]=$level_identifier.$this->item_pointer.$chld[$this->item_list_field_name];
                array_push($this->all_childs,$chld);
                $this->getAllChilds($chld[$this->item_identifier_field_name], ($level_identifier.$this->level_identifier), false);
            }
        }
        if($start) {
            return $this->all_childs; 
        }
    } 

    private function getImmediateChilds($parent_identifier_field_value, $extra_condition="", $order_by_phrase="") { // get only the direct/immediate childs under a parent 
        $sql="SELECT * FROM `".$this->db_table."` WHERE `".$this->parent_identifier_field_name."`='".$parent_identifier_field_value."' ".$extra_condition." ".$order_by_phrase;
        $res=mysql_query($sql);
        $childs=array();
        while($val=mysql_fetch_assoc($res)) {
            array_push($childs,$val);
        }
        return $childs; 
    }

    public function getItemPath($item_id,$start=true){ //returns the total path of a given item/node(the list of elements starting from the top level root node to the given item/node)

        if($item_id != 0) {
            $sql="SELECT * FROM `".$this->db_table."` WHERE `".$this->item_identifier_field_name."`='".$item_id."' ";
            $res=mysql_query($sql);
            $itemdata=mysql_fetch_assoc($res);
            array_push($this->item_path,$itemdata); 

            if($itemdata[$this->parent_identifier_field_name]!=0) {
                $this->item_path=$this->getItemPath($itemdata[$this->parent_identifier_field_name],false);
            } 
            if ($start) {
                $this->item_path=array_reverse($this->item_path);
            }
        }
        return $this->item_path;

    }

    public function db_connect(){
        $conn = mysql_connect($this->db_host, $this->db_user, $this->db_pass); 
        if($conn) {
            mysql_select_db($this->db_database, $conn);
        } 
        return $conn;
    }

    public function db_disconnect(){
        mysql_close();
    }
} 
?>
4

1 に答える 1

0

そのクラスによって生成された生の配列から、ネストされた必要な配列を並べ替えて構築する関数を見つけました。

function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) {
        if(!is_array($inArray)) {
            return;
        }

        if(!is_array($outArray)) {
            return;
        }

        foreach($inArray as $key => $tuple) {
            if($tuple['parentID'] == $currentParentId) {
                $tuple['children'] = array();
                makeParentChildRelations($inArray, $tuple['children'], $tuple['id']);
                $outArray[] = $tuple;   
            }
        }
    }

    $outArray = array();
    makeParentChildRelations($inArray, $outArray);
于 2013-06-16T01:57:23.587 に答える