-1

标题不是很好,但我想我可以更好地解释我想要达到的目标:

给定一个平面文件:

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 中执行此操作,但老实说,我对此没有语言偏好。哪个代码可以解决这样的问题?

4

1 回答 1

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, '  '));
于 2013-06-10T02:16:29.630 回答