如何将字符串分解为多级数组?

时间:2011-10-29 12:11:27

标签: php arrays split explode multi-level

我想知道是否可以做这样的事情。

我有以下字符串:

Parent1@MiddleA%Child|Child|Child|MiddleB%Child|Child|Child|Parent2@MiddleA%|Child

我想将它分解为:

-Parent1
---MiddleA
------Child
------Child
------Child
---MiddleB
------Child
------Child
------Child
-Parent2
---MiddleA
------Child

我不明白如何将其爆炸,然后再次将其爆炸以创建如上所述的输出。

这个想法是每个父母都会被标识为尾随@,该父母的每个孩子都会有一个尾随%,并且该孩子的每个孩子都会有一个尾随|

3 个答案:

答案 0 :(得分:0)

我想没有办法自动将它分解为多维数组,所以你必须编写你的特定算法来完成这项工作。 字符串中有一个逻辑顺序,因此可以很容易地进行转换。从“@”开始爆炸,然后每个元素被“A%”爆炸,然后被“|”爆炸。

答案 1 :(得分:0)

<?php
$string = "Parent1@MiddleA%Child|Child|Child|MiddleB%Child|Child|Child|Parent2@MiddleA%|Child";

$explode1 = explode ("@",$string);

foreach ($explode1 as $str)
{

  $explode2 = explode("|", $str);

  foreach ($explode2 as $str2)
  {
    $explode3 = explode ("%", $str2);

        foreach($explode3 as $str3)
        {
        echo ($str3 != "") ? $str3 . "<br/>" : "";
        }
  }

}
?>

将输出:

Parent1
MiddleA
Child
Child
Child
MiddleB
Child
Child
Child
Parent2
MiddleA
Child

答案 2 :(得分:0)

您在问题中输入的数据:

Parent1@MiddleA%Child|Child|Child|MiddleB%Child|Child|Child|Parent2@MiddleA%|Child

不太适合生成您要求的输出。它的结尾甚至是语法不正确,特别是MiddleA%|Child中的分隔符。

对此进行更正,您可以使用preg_split

轻松完成此操作
$str = 'Parent1@MiddleA%Child|Child|Child|MiddleB%Child|Child|Child|Parent2@MiddleA%Child|';

$elements = preg_split('~([^@%|]+?[@%|])~', $str, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

$types = '@%|';
foreach($elements as $element)
{
    $label = substr($element, 0, -1);
    $type = substr($element, -1);
    $indentValue = strpos($types, $type);
    if (FALSE === $indentValue) throw new Exception('Invalid string given.');
    $indent = str_repeat('-', $indentValue * 2 + 1);
    printf("%s %s\n", $indent, $label);
}

如果您没有有效格式的输入字符串,则需要先修复它,例如使用适当的解析器,或者您需要对foreach循环内的伪造案例作出反应。

编辑:这是一个修改过的示例,它将字符串转换为树状结构,以便您可以使用嵌套的foreach循环输出它:

$str = 'Parent1@MiddleA%Child|Child|Child|MiddleB%Child|Child|Child|Parent2@MiddleA%Child|';

$types = '@%|';
$pattern = sprintf('~([^%1$s]+?[%1$s])~', $types);
$elements = preg_split($pattern, $str, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

$tree = array();
foreach($elements as $element)
{
    $label = substr($element, 0, -1);
    $type = substr($element, -1);
    $indentValue = strpos($types, $type);
    if (FALSE === $indentValue) throw new Exception('Invalid string given.');

    $add =& $tree;
    for($i = $indentValue; $i--;)
    {
        $index = max(0, count($add)-1);
        $add =& $add[$index][1];
    }
    $add[] = array($label, array());
    unset($add);
}

foreach($tree as $level1)
{
    echo '<div>', $level1[0], "\n";
    foreach($level1[1] as $level2)
    {
        echo '  <h3>', $level2[0], '</h3>', "\n";
        foreach($level2[1] as $level3)
        {
            echo '    <span>', $level3[0],'</span>', "\n";
        }
    }
    echo '</div>', "\n";
}

Demo) - 希望这有用。