这样简单否$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": []
    }
]

解决方案 »

  1.   

    越是简单的代码越难看懂啊……
    琢磨了半天干脆用我的数据试,结果试不正确
    然后再看这个代码,发现不是错的吗?
    按照这里给出的$ar,结果应该是
    [{
       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虽然看起来是数字,但是和索引没半点关系……
    }
      

  2.   

    现在用的代码是这个:
    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;
    }
    }
    }
    }