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

时间:2013-06-09 22:59:19

标签: 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

如何从中创建嵌套的“数组数组”结构?子节点由其父节点中的TAB字符预先定义。

我目前正在尝试在php中执行此操作,并且没有太多工作要展示。我一直试图找出逻辑。

我认为最好的解决方案可能是某种递归,也许是tab_count变量和tab_count_ceiling变量?

我开始在php中这样做,但老实说,我对此没有语言偏好。哪个代码可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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, '  '));
相关问题