你需要最终的关联数组或者json的格式是什么情况呢?

解决方案 »

  1.   

    我大致的看了一下,觉得不用要递归,首先第一行最前面没有tab,第二行是在第一行下面的并且有一个tab,你可以归到第一个下面,PHP里面用数组好实现,然后第三个是属于第二个的,根据二个tab可以得到,所以这样下来,把它们全部加到数组里面。
      

  2.   

    $content = file('http://fifm.cn/data/13.txt');
    $line = array();
    foreach($content as $k=>$v)
    {
      $key   = $k+1;
    $tabs  = substr_count($v,"\t");
      $lines[$tabs] = $k;
    $newArray[$k] = array('id'=>$k,'pid'=>$lines[$tabs-1],'name'=>str_replace("\t",'',$v));
    //大致模拟成数据库记录
    echo print_r(array('id'=>$k,'pid'=>$lines[$tabs-1],'name'=>str_replace("\t",'',$v)),1)."<br/>";
    }
      

  3.   

    这样写
    $ar = file('13.txt');foreach($ar as $v) {
      $t = preg_replace("/(\t*)(.+)$/e", 'strlen("$1").","."$2"', $v);
      list($deep, $value) = split(',', trim($t));
      $tmp[] = array('deep' => $deep, 'value' => $value);
    }
    //print_r($tmp);$i = 0;
    $deep = 1;
    $out[] = array('value' => $tmp[$i++]['value'], 'child' => foo());
    echo count($tmp);function foo() {
      global $tmp, $i, $deep;
      $r = array();
      while($i < count($tmp)) {
        if($tmp[$i]['deep'] == $deep) {
          $r['vaule'][] = $tmp[$i]['value'];
          $i++;
        }
        if($tmp[$i]['deep'] > $deep) {
          $deep = $tmp[$i]['deep'];
          $r['child'][] = foo();
        }
        if($tmp[$i]['deep'] < $deep) {
          $deep = $tmp[$i]['deep'];
          return $r;
        }
      }
      return $r;
    }print_r($out);
      

  4.   

    七楼的技巧不错,主要就是早上一级的id,数据结构就是 $tr[级别][编号],复杂一点就是$content = file('http://fifm.cn/data/13.txt');
    $line = array();
    foreach ($content as $k => $v)
    {
    $key = $k + 1;
    $tr[substr_count($v, "\t")][]=$k;  //store this level's 
    $pid=is_array($tr[substr_count($v, "\t")-1])?end($tr[substr_count($v, "\t")-1]):"";
    echo print_r(array(
    'id' => $k, 
    'pid' =>$pid,  //get previous level's last node 
    'name' => str_replace("\t", '', $v)), 1) . "<br/>";
    }
      

  5.   

    虽然不清楚,文件的真正数据格式,但是有两个思路:
    1.可以参考一下yaml,看能不能先转成符合yaml语法的数据,语法规范:
    http://www.yaml.org/spec/1.2/spec.html2.先把数据分行分段存入数据库,在按条件查询输出。
      

  6.   

    项目完成。感谢大家支持。
    结贴之前,贴一个我的代码,非常繁杂。<?php$list = file('13.txt');$region = array();
    $one = getList($list, 1);
    foreach ($one as $value_one)
    {
        $block = getBlock($value_one);
        $array_one = getValue($value_one);
        $two = getList($block, 2);
        //print_r($two);
        foreach ($two as $value_two)
        {
            $array_two = getValue($value_two);
            if($array_two['id']>0){
                $region[$array_one['name']][$array_two['id']] = $array_two['name'];
            }else{
                $block = getBlock($value_two);
                $array_three = getValue($value_two);
                $three = getList($block, 3);
                foreach ($three as $value_three)
                {
                    $array_three = getValue($value_three);
                    if($array_three['id']>0){
                        //echo $array_three['name'];
                        $region[$array_one['name']][$array_two['name']][$array_three['id']]=$array_three['name'];
                    }else{
                        
                       /* 四级 */
                        $block = getBlock($value_three);
                        $array_four = getValue($value_three);
                        $four = getList($block, 4);
                        foreach ($four as $value_four)
                        {
                            $array_four = getValue($value_four);
                            if($array_four['id']>0){
                                $region[$array_one['name']][$array_two['name']][$array_three['name']][$array_four['id']]=$array_four['name'];
                            }else{
                                
                                /* 五级 */
                                $block = getBlock($value_four);
                                $array_five = getValue($value_four);
                                $five = getList($block, 5);
                                foreach ($five as $value_five)
                                {
                                    $array_five = getValue($value_five);
                                    if($array_five['id']>0){
                                        $region[$array_one['name']][$array_two['name']][$array_three['name']][$array_four['name']][$array_five['id']]=$array_five['name'];
                                    }
                                }
                                
                                /* 五级 */
                            }
                        }
                        
                        
                        /* 四级 */
                    }
                }
                
            }
        }
        
    }print_r($region);/* 获取一个指定区域名称的下级内容 */
    function getBlock($name)
    {
        global $data;
        
        /* 计算级别 */
        preg_match("@[\r\n](\t+)[\d-/]+{$name}[\r\n]@is", $data, $line);
        $no = strlen($line[1]);    preg_match("@{$name}([\r\n]+[\s\S]*?)[\r\n]\t{{$no}}\d@is", $data, $block);
        return $block[1];
    }/* 获取列表 */
    function getList($list, $key=1)
    {
        preg_match_all("@[\r\n]\t{{$key}}\d+/[-\d]+/([-\d]+/[^\r\n]+)[\r\n]@is", $list, $item);
        return $item[1];
    }function getValue($row)
    {
        $array = array();
        list($array['id'], $array['name']) = explode("/", $row);
        return $array;
    }?>