我想使用这个Recursive Function将php数组转换为父数组和子数组。
我有一个这样的细胞:
class MenuCell extends Cell {
public function display($menu) {
$this->loadModel('Menus');
$menus = $this -> Menus -> find('all', [
'contain' => ['MenuItems']
]) -> where(['id' => $menu]);
$menus = $this -> buildTree($menus);
$this -> set(compact('menus'));
$this -> set('_serialize', ['menus']);
}
public function buildTree($ar, $pid = null) {
$op = array();
foreach($ar as $item) {
if ($item['parentId'] == $pid) {
$op[$item['id']] = array(
'name' => $item['name'],
'parentId' => $item['parentId']
);
// using recursion
$children = $this ->buildTree($ar, $item['id']);
if ($children) {
$op[$item['id']]['children'] = $children;
}
}
}
return $op;
}
}
然而,如果我在控制器中做同样的事情,它的工作非常好。 任何帮助都可以节省我的一天。
答案 0 :(得分:1)
如果你想创建dinamic菜单,试试这个:
首先检查你的MenusTable,你的表应该有父id的字段(在我的例子中是parent_id)并创建关系belongsTo,hasMany
菜单型号
class MenusTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('menus');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->addBehavior('Tree');
$this->belongsTo('ParentMenus', [
'className' => 'Menus',
'foreignKey' => 'parent_id'
]);
$this->hasMany('ChildMenus', [
'className' => 'Menus',
'foreignKey' => 'parent_id'
]);
}
}
<强> MenuCell 强>
class MenuCell extends Cell {
public function display($menu) {
$this->loadModel('Menus');
$menus = $this->Menus->find('threaded')->where(['id'=>$menu])->toArray();
$menus = $this->buildTree($menus);
$this->set(compact('menus'));
$this->set('_serialize', ['menus']);
}
//Recursive function:
protected function buildTree($menus) {
foreach($menus as $element) {
if(!is_array($element)) {
$element = $element->toArray();
}
//Elements each menu array
$menu['name'] = $element['name'];
$menu['url'] = $element['url'];
foreach($element as $key => $value){
if(is_array($value)) {
$menu[$key] = $this->buildTree($value);
}
}
$resultMenu[] = $menu;
}
if(isset($resultMenu)) {
return $resultMenu;
}
}
}
示例结果:
[
(int) 0 => [
'name' => 'Level_1',
'url' => '/',
'children' => null
],
(int) 1 => [
'name' => 'Level_1',
'url' => '/',
'children' => [
(int) 0 => [
'name' => 'Level_1.1',
'url' => '/',
'children' => [
(int) 0 => [
'name' => 'Level_1.1.1',
'url' => '/',
'children' => null
],
(int) 1 => [
'name' => 'Level_1.1.1',
'url' => '/',
'children' => null
]
]
],
(int) 1 => [
'name' => 'Level_1.1',
'url' => '/',
'children' => null
]
]
],
(int) 2 => [
'name' => 'Level_1',
'url' => '/',
'children' => null
],
(int) 3 => [
'name' => 'Level_1',
'url' => '/',
'children' => null
]
]