【问题标题】:Building a nested array构建嵌套数组
【发布时间】:2017-05-19 19:25:14
【问题描述】:

我有一个大纲格式的文本文档,最多可以有 6 个级别。

.step1 -- step 1. text
..step2 -- step 1. A. text
..step2 -- step 1. B. text
..step2 -- step 1. C. text
..step2 -- step 1. D. text
..step2 -- step 1. E. text
.step1 -- step 2. text
..step2 -- step 2. A. text
...step3 -- step 2. A. (1) text
...step3 -- step 2. A. (2) text
.step1 -- step 3. text

我正在使用正则表达式解析文本文档并构建一个结构如下的数组

$contentsArray structure
    'level' INT - the step level
    'type'  STRING - the type of tag, note, warning, step1, step2
    'line'  INT - the line number in the file
    'text'  STRING - the text

 ------ SAMPLE ARRAY -------

   [0] => Array
    (
        [level] => 1
        [type] => step1
        [line] => 8
        [text] => Step 1. text
    )

[1] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 10
        [text] => Step 1. A. text
    )

[2] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 12
        [text] => Step 1.B. text
    )

[3] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 14
        [text] => Step 1. C. text.
    )

[4] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 16
        [text] => Step 1. D. text.
    )

[5] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 18
        [text] => Step 1. E. text.
    )

[6] => Array
    (
        [level] => 1
        [type] => step1
        [line] => 20
        [text] => Step 2. text
    )

[7] => Array
    (
        [level] => 2
        [type] => step2
        [line] => 22
        [text] => Step 2. A. Text.
    )

[8] => Array
    (
        [level] => 3
        [type] => step3
        [line] => 26
        [text] => Step 2. A. (1) Text.
    )

[9] => Array
    (
        [level] => 3
        [type] => step3
        [line] => 28
        [text] => Step 3. A. (2) Text.
    )

[10] => Array
    (
        [level] => 1
        [type] => step1
        [line] => 30
        [text] => Step 3. Text
    )

最终目标是将其转换为嵌套的 XML 文档。

<step1>Step 1. text
   <step2>Step 1. A. text</step2>
   <step2>Step 1. B. text</step2>
   <step2>Step 1. C. text</step2>
   <step2>Step 1. D. text</step2>
   <step2>Step 1. E. text</step2>
</step1>
<step1>Step 2. text
   <step2>Step 2. A. text
     <step3>Step 2. A. (1) text</step3>
     <step3>Step 2. A. (2) text</step3>
   </step2>
</step1>
<step1>Step 3. text
</step1>

我认为我需要构建一个嵌套数组,然后我可以将其转换为 XML。我认为这个数组的结构类似于

   [0] => Array
        (
            [level] => 1
            [type] => step1
            [line] => 8
            [text] => Step 1. text
        ), Array
            (
                [level] => 2
                [type] => step2
                [line] => 10
                [text] => Step 1. A. text
            ), Array
            (
                [level] => 2
                [type] => step2
                [line] => 12
                [text] => Step 1.B. text
            ), Array
            (
                [level] => 2
                [type] => step2
                [line] => 14
                [text] => Step 1. C. text.
            ), Array
            (
                [level] => 2
                [type] => step2
                [line] => 16
                [text] => Step 1. D. text.
            ), Array
            (
                [level] => 2
                [type] => step2
                [line] => 18
                [text] => Step 1. E. text.
            )
        )
    [1] => Array
        (
            [level] => 1
            [type] => step1
            [line] => 20
            [text] => Step 2. text
        , Array
            (
                [level] => 2
                [type] => step2
                [line] => 22
                [text] => Step 2. A. Text.
                , Array
                (
                    [level] => 3
                    [type] => step3
                    [line] => 26
                    [text] => Step 2. A. (1) Text.
                ), Array
                (
                    [level] => 3
                    [type] => step3
                    [line] => 28
                    [text] => Step 3. A. (2) Text.
                )
            )
        )

    [2] => Array
        (
            [level] => 1
            [type] => step1
            [line] => 30
            [text] => Step 3. Text
        )

我需要一些帮助来循环遍历我已构建的数组并使用level 值来找出最终数组中的嵌套。到目前为止,我的尝试毫无结果。我觉得有一种递归或迭代方式可以做到这一点,但这些不是我的强项。

感谢您的帮助,我希望这个问题足够清楚。

更新问题我发现我在提问方面做得很差,所以我做了一些修改。

【问题讨论】:

  • 如果你使用 PHP,你应该用 'php' 标签标记问题
  • 我在 PHP 中这样做,但对我来说这更像是一个技术问题。
  • 您描述了一个具有 4 个属性的关联数组,但是您的输入中的“文本”部分在哪里,为什么您的数组只有一个“文本”属性而不是其他 3 个?

标签: php arrays recursion tree


【解决方案1】:

您的示例不一致。假设最后一个 ...step3 是一个错误,这将做你想要的。它在 perl 中,但应该很容易翻译。

sub main {
  my @labels;
  while (<>) {
    if (/^(\.+)(.*)$/) {
      my $level = length($1);
      print "</" . pop(@labels) . ">\n" while $level <= scalar(@labels);
      die "Bad input" unless $level == 1 + scalar(@labels);
      print "<" . $2 . ">\n";
      push @labels, $2
    }
  }
  print "</" . pop(@labels) . ">\n" while (@labels);
}

main;

它使用了一个简单的堆栈,并且处理级别相对于当前堆栈大小发生了变化。

我会让你计算出压痕。您也可以根据堆栈大小执行此操作。

加法

嗯,你已经改变了很多问题。但是使用堆栈的基本方法和根据堆栈长度更改处理级别仍然可以正常工作。

【讨论】:

    【解决方案2】:

    这是当您在变量$input 中输入文本时的 PHP 实现:

    $stack = [];
    foreach(explode("\n", $input . "\n.") as $line) {
        $line = trim($line);
        $type = ltrim($line, ".");
        $dots = strlen($line) - strlen($type);
        if (!$dots || $dots > count($stack) + 1) throw new Exception("Bad input format");
        while($dots <= count($stack)) 
            $xml[] = str_repeat("    ", count($stack)-1) . array_pop($stack);
        $xml[] = str_repeat("    ", count($stack)) . "<$type>";
        $stack[] = "</$type>";
    }
    $xml = implode("\n", array_slice($xml, 0, -1));
    echo $xml;
    

    查看它在eval.in 上运行。

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2014-07-17
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多