1

Тема: Поділ на рівні вкладеності у PHP

Підкажіть, будь ласка, чи можна розділити на рівні вкладеності рядок та кожному рівню вкладеності задати відсоток (де між фігурною дужкою та прямою рисою йде значення).

Наприклад, такий рядок: {1 рівень – 1 | 1 рівень – 2 { 2 рівень – 1 | 2 рівень - 2 } }

Щоб у результаті вийшов рядок:

{50%: 1 рівень – 1 | 50%: 1 рівень – 2 { 25%: 2 рівень – 1 | 25%: 2 рівень - 2 } }

Приблизно за таким принципом. Не лише на 2 рівень, а й на глибші рівні вкладеності.

2

Re: Поділ на рівні вкладеності у PHP

Найпростіше це зробити рекурсією.
Функція приймає рядок і відсоток (спершу  - 100%). Ділите рядок (у вашому випадку - по | поза {}) на групи, кожній групі задаєте відсоток. Далі для тих груп, де є підгрупи, викликаєте цю ж функцію з відсотком для цих груп.
Але, здається, ви обрали неправильну структуру даних, рядок не дуже зручна штука для такого. Яке загальне завдання? Тут немає часом проблеми XY?

Подякували: alexsun7, leofun012

3

Re: Поділ на рівні вкладеності у PHP

koala написав:

Найпростіше це зробити рекурсією.
Функція приймає рядок і відсоток (спершу  - 100%). Ділите рядок (у вашому випадку - по | поза {}) на групи, кожній групі задаєте відсоток. Далі для тих груп, де є підгрупи, викликаєте цю ж функцію з відсотком для цих груп.
Але, здається, ви обрали неправильну структуру даних, рядок не дуже зручна штука для такого. Яке загальне завдання? Тут немає часом проблеми XY?

Тут питання, як зробити поділ, щоб він був по "|" поза "{}".

4

Re: Поділ на рівні вкладеності у PHP

О, людина скінчені автомати не вивчала. Майже псевдокодом (Python):

level = 0
parts = [""]
for c in string: #перебираємо по символу
  if c=="{":
    level += 1 #підвищуємо рівень
  elif c=="}"
    level -= 1 #знижуємо рівень
  elif c=="|": 
    if level == 1: #якщо ми на рівні 1, тобто поточному
       parts.append("") #додаємо порожній рядок в кінець parts
  parts[-1] += c #додаємо поточний символ до останнього рядка в parts

Це дуже нашвидкуруч (здається, там | буде чіплятися куди не треба), але ідея має бути зрозуміла: якщо це нижній рівень (1), то символи між | заганяємо в останню частину parts. Якщо не нижній, то | теж заганяємо, бо це частина підрядка іншого рівня.

Подякували: alexsun71

5

Re: Поділ на рівні вкладеності у PHP

Ну якщо у вас готовий рядок

<?php
$string = '{1 рівень – 1 |1 рівень – 2 {2 рівень – 1 |2 рівень - 2  {3 рівень – 3 |3 рівень - 1 }  } }';

$count = substr_count($string, '{');
$cnt = $count;

for ($i = 1;$i <= $count;$i++)
{

    $percent = round((($cnt * 100)) / $count, 1).'% ';

    $search = ['{' . $i, '|' . $i];
    $replace = ['{' . $percent . $i, '|' . $percent . $i];

    $string = str_replace($search, $replace, $string);
    $cnt--;
}

echo $string;

Результат:

{100% 1 рівень – 1 |100% 1 рівень – 2 {66.7% 2 рівень – 1 |66.7% 2 рівень - 2  {33.3% 3 рівень – 3 |33.3% 3 рівень - 1 }  } }

Це якщо відсоток брати від кількості рівнів вкладеності.

Подякували: alexsun71

6

Re: Поділ на рівні вкладеності у PHP

VTrim, ваш код уже на {{}|{}} ламається.

7

Re: Поділ на рівні вкладеності у PHP

Мій код працює за тією структурою, яка була надана автором. Іншої варіативності не було ніби.