21,887
社区成员
发帖
与我相关
我的任务
分享
[{
id:1,
name:0,
children:[{
id:2,
nane:00,
children:[{
id:3,
name:000
}]
}]
},{
id:4,
name:001,
children:[]
}]
$res=array();
$data=array({id:...});
$i=0;
px($res,$data,$i);
function px(&$point,&$data,&$i){
if(!sizeof($point)){
$now=$data[$i];
$point[]=$now;
$i++;
}
$flag=true;
$nowl=strlen($now['dir']);
while($flag && (sizeof($data)!=$i) ){
if($nowl==strlen($data[$i]['dir'])){
$now=$data[$i];
$point[]=$now;
$i++;
}else{
if($nowl < (strlen($data[$i]['dir'])) ){
$temp=array();
px($temp,$data,$i);
$point[sizeof($point)-1]['children']=$temp;
}else{
$flag=false;
}
}
}
}
$ar = array(
array('id' => 1, 'name' => '0'),
array('id' => 2, 'name' => '00'),
array('id' => 3, 'name' => '000'),
array('id' => 4, 'name' => '001'),
array('id' => 5, 'name' => '1'),
array('id' => 6, 'name' => '10'),
array('id' => 7, 'name' => '100'),
array('id' => 8, 'name' => '2'),
);
$res = array();
foreach($ar as $v) {
$p =& $res;
foreach(str_split($v['name']) as $k) {
if(isset($res[$k])) $p =& $p[$k]['children'];
$p[$k] = $v;
$p[$k]['children'] = array();
}
}
echo json_encode($res, JSON_PRETTY_PRINT);
[
{
"id": 1,
"name": "0",
"children": [
{
"id": 4,
"name": "001",
"children": [
{
"id": 4,
"name": "001",
"children": []
},
{
"id": 4,
"name": "001",
"children": []
}
]
}
]
},
{
"id": 5,
"name": "1",
"children": {
"1": {
"id": 7,
"name": "100",
"children": []
},
"0": {
"children": [
{
"id": 7,
"name": "100",
"children": [
{
"id": 7,
"name": "100",
"children": []
}
]
}
]
}
}
},
{
"id": 8,
"name": "2",
"children": []
}
]
function px(&$point,&$data,&$i){
$nowl=strlen($data[$i]['dir']);
if(!sizeof($point)){
$now=$data[$i];
$point[]=$now;
$i++;
}
$flag=true;
while($flag && (sizeof($data)!=$i) ){
if($nowl==strlen($data[$i]['dir'])){
$now=$data[$i];
$point[]=$now;
$i++;
}else{
if($nowl < (strlen($data[$i]['dir'])) ){
$temp=array();
px($temp,$data,$i);
$point[sizeof($point)-1]['children']=$temp;
}else{
$flag=false;
}
}
}
}
[{
id:1
name:0,
children:[{
id:2,
name:00, //但是在这里就已经错了啊……
children:[...]
}]
}]
然后这个思路是什么?
1、遍历$ar,第一个foreach
2、将$v拆分(我的数据里面是两个一组,得用str_split($v['name'],2))
但是赋值这里怎么做?因为层数不一定,可能会出现name='000000000000'的情况
也就是说对于name='01234567',
isset($p[$k]) '01'
isset($p[$klast.$k]) '0123'
isset($p[$klastlast.$klast.$k]) '012345'
嗯……
可是看版主给出的代码却是分别判断
'01'
'23'
'45'
这样走的,不对嘛……
这个地方就不对头了
foreach(str_split($v['name']) as $k) {
if(isset($res[$k])) $p =& $p[$k]['children'];
$p[$k] = $v;
$p[$k]['children'] = array();
}
foreach(str_split($v['name'],2) as $k=>$dv){
if(isset($res[]))
....想不出来啊,因为name虽然看起来是数字,但是和索引没半点关系……
}