-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 に答える