深度关联数组到相邻的 mysql 表



晚都在战斗。放弃。我在 mysql 中有一个相邻的表:

id, parentid,name,design,path,sort

深度最大为四个,使用 mysql 查询,我成功地将结果打印到 UL 列表中。从那里,项目被添加、排序、编辑以及删除。然后当单击按钮时,我将结果发送回 php。发送的数据是JSON,并且确实被接收。

json_decode()给出了以下示例:

Array ( [0] => Array ( [cls] => [path] => # [id] => 1 [name] =>BLOCKA  ) [1] => Array ( [cls] => [path] => # [id] => 2 [name] => BLOCKB [children] => Array ( [0] => Array ( [cls] => [path] => # [id] => 3 [name] => CLASSB1 [children] => Array ( [0] => Array ( [cls] => [path] => # [id] => 7 [name] => CLASSB12 ) ) ) [1] => Array ( [cls] => [path] => # [id] => 4 [name] => CLASSSB13 [children] => Array ( [0] => Array ( [cls] => [path] => # [id] => 5 [name] => CLASSB4 ) [1] => Array ( [cls] => [path] => # [id] => 6 [name] => CLASSB5 ) ) ) ) ) ) 

图形:

BLOCKA BLOCKB CLASSB1 CLASSB3 ...

我正在使用jquery.nested

现在我的问题是遍历数组,获取父级的 id,然后添加子项。

我最接近的是

function dissect($blocks) {
    if (!is_array($blocks)) {
        echo $blocks;
        return;
    }
    foreach($blocks as $block) {
        dissect($block);
    }
}

它确实处理每个元素,但不是以我想要的方式处理的。对不起,我的英语很差...任何帮助将不胜感激。

首先遍历获取父块,如果父块中存在子块,则遍历子块。

可能还有其他更好的方法来实现这一点,您可以尝试以下代码:

$blocks = array ( 
"0" => array ( 
    "cls" => "",
    "path" => array( 
        "id" => 1,
        "name" =>"BLOCKA",
        ) 
    ), 
"1" => array ( 
    "cls" => "",
    "path" => array( 
        "id" => 2,
        "name" => "BLOCKB" ,
        "children" => array ( 
            "0" => array ( 
                "cls" => "",
                "path" => array( 
                    "id" => 3,
                    "name" => "CLASSB1" ,
                    "children" => array ( 
                        "0" => array ( 
                            "cls" => "",
                            "path" => array( 
                                "id" => 7,
                                "name" => "CLASSB12" ,
                                ),
                            ),
                        ), 
                    ),
                ),
            "1" => array ( 
                "cls" => "",
                "path" => array( 
                    "id" => 4,
                    "name" => "CLASSSB13" ,
                    "children" => array ( 
                        "0" => array ( 
                            "cls" => "",
                            "path" => array( 
                                "id" => 5,
                                "name" => "CLASSB4" ,
                                ),
                            ), 
                        "1" => array ( 
                            "cls" => "",
                            "path" => array( 
                                "id" => 6,
                                "name" => "CLASSB5",
                                ), 
                            ), 
                        ), 
                    ),
                ), 
            ),
        ), 
    ), 
) ;
echo "<pre>";
/*loop through blocks*/
foreach ($blocks as $key => $block) {
    echo $block['path']['name'].'<br/>'; /* echo parent*/
    if (isset($block['path']['children'])) {
        loopChildren($block['path']['children']); /* children loop*/
    }
}
/*Loop through childrens*/
function loopChildren($childrens, $prefix = '-')
{
    foreach ($childrens as $key => $child) {
        getChild($child, $prefix);
    }
}
/*Get the child and loop sub-children if exist*/
function getChild($child, $prefix='-')
{ 
    echo $prefix. $child['path']['name'].'<br/>'; /*echo child*/
    if (isset($child['path']['children'])) {
        $prefix .= '-';
        loopChildren($child['path']['children'], $prefix); /* sub-children loop*/
    }
}
echo "</pre>";

输出:

BLOCKA
BLOCKB
-CLASSB1
--CLASSB12
-CLASSSB13
--CLASSB4
--CLASSB5
<</div> div class="one_answers">

感谢您的提示。它引导我找到了一个对我有用的答案。我最终使用了两个函数。错误是"索引越界"...这是我现在所做的...调用 MySQL 表:

$response = json_decode($_POST['s'], true); // decoding received JSON to array
if(is_array($response)){

//start saving now
$order=1;
 foreach ($response as $key => $block) {
  //0 is for blocks: no parent id needed
 $parentid=$this->Blocks_model->insertblock($block['name'],$block['cls'],0,$block['path'],$order);
if (isset($block['children'])) {

   $this->childblocks($parentid,$block['children']);

}
$order++;
}

}
private function childblocks($parentid,$e){
$order=1;
foreach ($e as $key => $block) {
$parentid=$this->Blocks_model->insertblock($block['name'],$block['cls'],0,$block['path'],$order);

if (isset($block['children'])) {
$this->childblocks($parentid,$block['children']);
}
$order++;
}

}

最新更新