好的,基本上,我已经形成了一个mySQL查询,它返回一个完全按我的数据结构排序的数据集。如果我要声明它,它看起来像这样:
$arr = array(
array( 'name' => 'Root', 'depth' => 0 ),
array( 'name' => 'Food', 'depth' => 0 ),
array( 'name' => 'Fruit', 'depth' => 1 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Apple', 'depth' => 2 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Meat', 'depth' => 1 ),
array( 'name' => 'Furniture', 'depth' => 0 )
);
我想要的是将这个$ arr提供给一个方法,这样我就可以得到一个多维数组。
例如,Fruit将是Food的孩子。而Bananana将是Fruit的孩子。 我需要每个“孩子”的钥匙都是“页面”。
我上面展示的数组也可以返回其他信息,例如'lft'和'rgt'。我没有'parentId'设置,但如果需要我可以更改我的模型,但我更喜欢坚持使用嵌套集模型。
答案 0 :(得分:5)
这样的事可能
$arr = array(
array( 'name' => 'Root', 'depth' => 0 ),
array( 'name' => 'Food', 'depth' => 0 ),
array( 'name' => 'Fruit', 'depth' => 1 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Apple', 'depth' => 2 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Meat', 'depth' => 1 ),
array( 'name' => 'Furniture', 'depth' => 0 )
);
$p = array(array());
foreach($arr as $n => $a) {
$d = $a['depth'] + 1;
$p[$d - 1]['children'][] = &$arr[$n];
$p[$d] = &$arr[$n];
}
print_r($p[0]);
答案 1 :(得分:4)
以下代码假定您的值的顺序和深度正确。请注意,它使用键删除重复项。
header('Content-Type: text/plain');
$arr = array(
array( 'name' => 'Root', 'depth' => 0 ),
array( 'name' => 'Food', 'depth' => 0 ),
array( 'name' => 'Fruit', 'depth' => 1 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Apple', 'depth' => 2 ),
array( 'name' => 'Bannnanna', 'depth' => 2 ),
array( 'name' => 'Meat', 'depth' => 1 ),
array( 'name' => 'Furniture', 'depth' => 0 )
);
function process( &$arr, &$prev_sub = null, $cur_depth = 0 ) {
$cur_sub = array();
while( $line = current( $arr ) ) {
if( $line['depth'] < $cur_depth ) {
return $cur_sub;
} elseif( $line['depth'] > $cur_depth ) {
$prev_sub = process( $arr, $cur_sub, $cur_depth + 1 );
} else {
$cur_sub[$line['name']] = $line['name'];
$prev_sub =& $cur_sub[$line['name']];
next( $arr );
}
}
return $cur_sub;
}
$values = process( $arr );
print_r( $values );
输出:
Array
(
[Root] => Root
[Food] => Array
(
[Fruit] => Array
(
[Bannnanna] => Bannnanna
[Apple] => Apple
)
[Meat] => Meat
)
[Furniture] => Furniture
)