Данные, которые вы вводите в качестве входных данных для вашего вопроса:
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 ) - надеюсь, это полезно.