<?php
$text = <<<'EOD'
Категория1
Подкатегория1
Подкатегория2
ПодПодкатегория1
ПодПодкатегория2
ПодПодПодкатегория1
Подкатегория3
Категория2
Подкатегория4
EOD;
// нормализуем форматирование
function buildTree
(array &$lines, $level = 0) { $nodes = [];
$currentLevel = $level;
// подбираем первую строку
$line = $lines[0];
$currentLevel = strlen(preg_split("/^(\t*)/", $line, 2, PREG_SPLIT_DELIM_CAPTURE
)[1]); if ($currentLevel - $level > 1) {
throw new \InvalidArgumentException("Wrong formatting!");
}
$node = [];
if ($currentLevel > $level) {
$node['children'] = buildTree($lines, $level+1);
} else if ($currentLevel < $level) {
return $nodes;
}
$node['name'] = ltrim($line, "\t"); $nodes[] = $node;
}
return $nodes;
}
PD9waHAKCiR0ZXh0ID0gPDw8J0VPRCcK0JrQsNGC0LXQs9C+0YDQuNGPMQogICAg0J/QvtC00LrQsNGC0LXQs9C+0YDQuNGPMQogICAg0J/QvtC00LrQsNGC0LXQs9C+0YDQuNGPMgogICAgICAgINCf0L7QtNCf0L7QtNC60LDRgtC10LPQvtGA0LjRjzEKICAgICAgICDQn9C+0LTQn9C+0LTQutCw0YLQtdCz0L7RgNC40Y8yCiAgICAgICAgICAgINCf0L7QtNCf0L7QtNCf0L7QtNC60LDRgtC10LPQvtGA0LjRjzEKICAgINCf0L7QtNC60LDRgtC10LPQvtGA0LjRjzMK0JrQsNGC0LXQs9C+0YDQuNGPMgogICAg0J/QvtC00LrQsNGC0LXQs9C+0YDQuNGPNApFT0Q7CgovLyDQvdC+0YDQvNCw0LvQuNC30YPQtdC8INGE0L7RgNC80LDRgtC40YDQvtCy0LDQvdC40LUKJHRleHQgPSBzdHJfcmVwbGFjZSgnICAgICcsICJcdCIsICR0ZXh0KTsKCmZ1bmN0aW9uIGJ1aWxkVHJlZShhcnJheSAmJGxpbmVzLCAkbGV2ZWwgPSAwKSB7Cgkkbm9kZXMgPSBbXTsKCSRjdXJyZW50TGV2ZWwgPSAkbGV2ZWw7Cgl3aGlsZSAoY291bnQoJGxpbmVzKSkgewoJCS8vINC/0L7QtNCx0LjRgNCw0LXQvCDQv9C10YDQstGD0Y4g0YHRgtGA0L7QutGDCgkJJGxpbmUgPSAkbGluZXNbMF07CgkJJGN1cnJlbnRMZXZlbCA9IHN0cmxlbihwcmVnX3NwbGl0KCIvXihcdCopLyIsICRsaW5lLCAyLCBQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUpWzFdKTsKCQlpZiAoJGN1cnJlbnRMZXZlbCAtICRsZXZlbCA+IDEpIHsKCQkJdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIldyb25nIGZvcm1hdHRpbmchIik7CgkJfQoJCQoJCSRub2RlID0gW107CgkJaWYgKCRjdXJyZW50TGV2ZWwgPiAkbGV2ZWwpIHsKCQkJJG5vZGVbJ2NoaWxkcmVuJ10gPSBidWlsZFRyZWUoJGxpbmVzLCAkbGV2ZWwrMSk7CgkJfSBlbHNlIGlmICgkY3VycmVudExldmVsIDwgJGxldmVsKSB7CgkJCXJldHVybiAkbm9kZXM7CgkJfQoJCSRub2RlWyduYW1lJ10gPSBsdHJpbSgkbGluZSwgIlx0Iik7CgkJJG5vZGVzW10gPSAkbm9kZTsKCQlhcnJheV9zaGlmdCgkbGluZXMpOwoJfQoJCglyZXR1cm4gJG5vZGVzOwp9Cgp2YXJfZHVtcChidWlsZFRyZWUoZXhwbG9kZSgiXG4iLCAkdGV4dCkpKTs=