fork(1) download
  1. <?php
  2.  
  3. function parse_hierarchy($text, $indent = 0) {
  4. static $format = '/^\t{%1$d}(?:$(*SKIP)(*FAIL)|(.+?)(?=^\t{%1$d}(?:[^\t]|$)|\z))/ms';
  5. $callback = function ($block) use ($indent) {
  6. list($a, $b) = explode("\n", $block, 2) + [1 => ''];
  7. return ($b = parse_hierarchy($b, $indent + 1)) ? [$a, $b] : [$a];
  8. };
  9. return preg_match_all(sprintf($format, $indent), $text, $m) ? array_map($callback, $m[1]) : [];
  10. }
  11.  
  12. $text = '
  13. 階層0-0
  14. 階層0-0-0
  15. 階層0-0-1
  16. 階層0-1
  17. 階層0-2
  18. 階層0-2-0
  19. 階層0-2-1
  20. 階層0-2-1-0
  21. 階層0-2-1-1
  22. 階層0-2-1-1-0
  23. 階層0-3
  24. ';
  25.  
  26. var_dump(parse_hierarchy($text));
Success #stdin #stdout 0.02s 24448KB
stdin
Standard input is empty
stdout
array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(9) "階層0-0"
    [1]=>
    array(2) {
      [0]=>
      array(1) {
        [0]=>
        string(11) "階層0-0-0"
      }
      [1]=>
      array(1) {
        [0]=>
        string(11) "階層0-0-1"
      }
    }
  }
  [1]=>
  array(1) {
    [0]=>
    string(9) "階層0-1"
  }
  [2]=>
  array(2) {
    [0]=>
    string(9) "階層0-2"
    [1]=>
    array(2) {
      [0]=>
      array(1) {
        [0]=>
        string(11) "階層0-2-0"
      }
      [1]=>
      array(2) {
        [0]=>
        string(11) "階層0-2-1"
        [1]=>
        array(2) {
          [0]=>
          array(1) {
            [0]=>
            string(13) "階層0-2-1-0"
          }
          [1]=>
          array(2) {
            [0]=>
            string(13) "階層0-2-1-1"
            [1]=>
            array(1) {
              [0]=>
              array(1) {
                [0]=>
                string(15) "階層0-2-1-1-0"
              }
            }
          }
        }
      }
    }
  }
  [3]=>
  array(1) {
    [0]=>
    string(9) "階層0-3"
  }
}