Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从以制表符分隔的父/子关系的平面文件创建多维数组结构?_Php_Arrays_Recursion_Parent Child - Fatal编程技术网

Php 如何从以制表符分隔的父/子关系的平面文件创建多维数组结构?

Php 如何从以制表符分隔的父/子关系的平面文件创建多维数组结构?,php,arrays,recursion,parent-child,Php,Arrays,Recursion,Parent Child,标题不太好,但我想我可以更好地解释我想要实现的目标,比如: 给定平面文件: MAIN 0 Sub Heading 0 Sub Heading 1 MAIN 1 Sub Heading 0 Sub Sub Heading 0 Sub Sub Heading 1 Sub Heading 1 Sub Heading 2 Sub Sub Heading 0 Sub Sub Sub Heading 0 MAIN 2 Sub Heading 0

标题不太好,但我想我可以更好地解释我想要实现的目标,比如:

给定平面文件:

MAIN 0
  Sub Heading 0
  Sub Heading 1
MAIN 1
  Sub Heading 0
    Sub Sub Heading 0
    Sub Sub Heading 1
  Sub Heading 1
  Sub Heading 2
    Sub Sub Heading 0
      Sub Sub Sub Heading 0
MAIN 2
  Sub Heading 0
我如何从中创建嵌套的“数组数组”结构?子项是由其父项中的制表符作为前缀来定义的

目前,我正试图用php实现这一点,但没有太多的工作要展示。我一直在努力找出逻辑

我相信最好的解决方案可能是某种递归,也许是一个tab\u count变量和一个tab\u count\u天花板变量


我开始用php做这件事,但老实说,我不喜欢这种语言。哪种代码可以解决这样的问题?

为了好玩,我写了这段代码

ini_set('error_reporting', -1);
ini_set('display_errors', 1);

/**
 * Recognising level of current header and header itself by counting prefixes
 * before header
 * @param string $string
 * @param string $prefix
 * @param &int $level
 * @param &string $header
 */
function myGetLevelAndHeader($string, $prefix, &$level, &$header)
    {
    preg_match('/^((?:' . preg_quote($prefix) . ')*)(.*)$/', $string, $match);
    $header = $match[2];
    $level = strlen($match[1]) / strlen($prefix);
    }

/**
 * Adding to headers array to the desired dimension without recursion
 * @param &array $headers ere
 * @param integer $level
 * @param string $header
 */
function myAddToHeaders(array &$headers, $level, $header)
    {
    $array = &$headers;
    while ($level--)
        {
        //adding new dimension
        is_null($array) ? $array = array() : end($array);

        $last_key = key($array);
        if (!is_null($last_key) && is_array($array[$last_key]))
            $array = &$array[$last_key]; // going deeper
        else
            $array = &$array[]; // create new element and going deeper
        };
    $array[] = $header;
    }

/**
 * Simple parsing function
 * @param array $lines
 * @param string $prefix
 * @return array
 */
function myParse(array $lines, $prefix = '  ')
    {
    $headers = array();
    foreach ($lines as $line)
        {
        myGetLevelAndHeader($line, $prefix, $level, $header);
        myAddToHeaders($headers, $level, $header);
        }
    return $headers;
    }

$lines = file('file.txt');

print_r(myParse($lines, '  '));

您可以尝试使用YAML解析器。你能改变文件的结构来包括:在每个标题中吗?我,我觉得标题更合适nice@Jessica聪明的黑客。是的,我想我能做到,是的,这可能会解决问题。我更感兴趣的是了解如何解决这个问题。显然,无论我使用什么YAML模块都可以解决这个问题。我会考虑查看他们的一些代码,看看他们想得到什么:<代码>数组(“0”=>数组(“子标题0”,“子标题1”)…< < /代码>或<代码>数组(‘主体0’=>数组(‘子标题0’=‘>’,‘子标题1’=>‘’))…< /代码>或其他?@ CasimiRethiPulePulter第二个将非常感谢!我需要消化/玩一会儿这根本不是我所期望的。然而,这是一个解决方案。有什么办法可以麻烦你用注释注释代码吗?@Kevin,照我说的做could@Kevin:你可以在重复的问题中找到更详细的解释以及如何滚动自己的问题。