我必须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();
}
}
?>
我找到了一个函数,该函数从该类生成的原始数组中重新排序并构建嵌套的所需数组:
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);