Подскажите, пожалуйста, можно ли разделить на уровни вложенности строку и каждому уровню вложенности задать процент (где между фигурной скобкой и прямой чертой идет значение). Например, такая строка: { 1 уровень - 1 | 1 уровень - 2 { 2 уровень - 1 | 2 уровень - 2 } } Чтобы в результате получилась строка: { 50%: 1 уровень - 1 | 50%: 1 уровень - 2 { 25%: 2 уровень - 1 | 25%: 2 уровень - 2 } } Примерно по такому принципу. Не только на 2 уровень, но и на более глубокие уровни вложенности.
Наверное будет лучше, если ты процитируешь исходную задачу. --- Добавлено --- Что означают эти проценты? Они всегда в равных долях на своём уровне или ... Их надо буквально вставлять в результат или... Короче, чтобы не получилось что мы сами придумаем задачу, решим её, а потом окажется, что ты имел в виду что-то другое. ))) Я думаю что ты это не сам выдумал, поэтому пожалуйста напиши что там было изначально.
Именно сам. Уровни вложенности разделяются прямой чертой "|". Если имеется 2 равных уровня вложенности, тогда будет каждый уровень по 50%, если 3 - 33,33%, если 4 - 25%. И так далее. Если на 1 уровне в 50% имеются 2 под уровня, тогда каждый подуровень будет по 25%. Как бы разделить такого типа строку по прямой черте "|" при этом не затрагивая фигурных скобок. А затем по порядку, следующее, следующее. Приходится все это вручную делать. Огромное количество времени на все это уходит, вот и задумался, каким образом это можно автоматизировать.
ну так напиши лексический анализатор, который будет тупо считать вложенные скобочки, вычисляя уровень, и что-то там считать и заменять. цикл и пара счетчиков. можно рекурсией. можно хитрым регулярным выражением. все варианты норм. делай как проще - циклом! @Fell-x27, не твоя задачка? я помню ты кого-то пытался учить арифметике со скобочками. --- Добавлено --- @alexsun7 врядли я сильно тебе помогу, если сделаю всю работу за тебя. ты ничему не научишься так, никаких новых нейронных связей не возникнет. весь секрет: считай уровень вложенности. скобочка закрылась на первом уровне - в этот момент возьми от-и-до и разбей на части. замени текст, если при этом во фрагменте есть скобки - повтори процедуру для фрагмента. профит!
Уровни сделал. Исходная строка: $str = '{текст|{текст|текст}|текст|{текст|текст}}'; Результат: {[УРОВЕНЬ: 1] текст|[УРОВЕНЬ: 1] {[УРОВЕНЬ: 2] текст|[УРОВЕНЬ: 2] текст}|[УРОВЕНЬ: 1] текст|[УРОВЕНЬ: 1] {[УРОВЕНЬ: 2] текст|[УРОВЕНЬ: 2] текст}} Как бы теперь подсчитать процент? Чтобы, например, на 2 уровне, брался процент 1 уровня и делился на количество элементов на 2 уровне. Там будут и более вложенные структуры.
декомпозиция function splitOnTopLevel(string $source, int $total = 100): string находит скобки на одном уровне, делит текст внутри скобок на фрагменты. далее обращается к функции подсчета долей calculateAndMark, полученный массив с указанными долями склеивает и возвращает строку. function calculateAndMark(array $parts, int $total): array получает фрагменты и сколько всего процентов приходится на ВСЕ эти фрагменты. если фрагмент содержит скобки, то обращается к splitOnTopLevel с указанием его доли. если скобок во фрагменте нет, то добавляет к фрагменту значение его доли от $total. и так мы обработаем любую вложенность скобок.