Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разделение на уровни вложенности в PHP 
:(
    Опции темы
alexsun7
Дата 17.4.2023, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.1.2023

Репутация: нет
Всего: нет



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

Например, такая строка: { 1 уровень - 1 | 1 уровень - 2 { 2 уровень - 1 | 2 уровень - 2 } }

Чтобы в результате получилась строка:

{ 50%: 1 уровень - 1 | 50%: 1 уровень - 2 { 25%: 2 уровень - 1 | 25%: 2 уровень - 2 } }

Примерно по такому принципу. Не только на 2 уровень, но и на более глубокие уровни вложенности.

Проще говоря, как бы разделить эту строку по "|", но чтобы оно было вне фигурных скобок.

Это сообщение отредактировал(а) alexsun7 - 17.4.2023, 14:13
PM MAIL   Вверх
korob2001
Дата 19.4.2023, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



Нужно извлечь в один список (массив) все уровни, начиная с самого внутреннего вложения. Вот пока пример на Perl, сейчас постараюсь переписать его на PHP, просто на PHP писал последний раз лет 10 назад. В принципе языки похожи, если не вспомню, то может кто-нить другой поможет.
Код

my $line = "{ 1 уровень - 1 | 1 уровень - 2 { 2 уровень - 1 | 2 уровень - 2 { 3 уровень - 1 | 3 уровень - 2 | 3 уровень - 3 | 3 уровень - 4 { 4 уровень - 1 | 4 уровень - 2 } } } }";
my @levels = ();
# ищем парные скобки с самой глубокой пары, захватываем подстроку и тут же вырезаем её из строки
while ($line =~ s/\{([^}{]+)\}//gi) {
        unshift(@levels, $1); # захваченную подстроку кидаем в начало массива, что бы самая глубокая пара была последней в массиве
}
# выводим на экран содержимое массива
print join("\n", @levels) . "\n";

Вот так выглядит теперь массив @levels:
Код

 1 уровень - 1 | 1 уровень - 2
 2 уровень - 1 | 2 уровень - 2
 3 уровень - 1 | 3 уровень - 2 | 3 уровень - 3 | 3 уровень - 4
 4 уровень - 1 | 4 уровень - 2

Где каждая строка - элемент массива

PS: сейчас попробую написать всё это на PHP.

Это сообщение отредактировал(а) korob2001 - 19.4.2023, 21:13


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 19.4.2023, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 1
Всего: 61



Вот, то же самое на PHP.  smile 
Код

<?php
$line = "{ 1 уровень - 1 | 1 уровень - 2 { 2 уровень - 1 | 2 уровень - 2 { 3 уровень - 1 | 3 уровень - 2 | 3 уровень - 3 | 3 уровень - 4 { 4 уровень - 1 | 4 уровень - 2 } } } }";
$levels = array();
function next_level($matches) {
    global $levels;
    array_unshift($levels, $matches[1]);
    return "";
}

while ($line = preg_replace_callback("/\{([^}{]+)\}/", "next_level", $line));

echo var_dump($levels);
?>

Просьба тапками не кидаться, наверняка есть способ покороче. Я просто пока писал это столько документации почитал про разные там preg_...., ereg_....., replace и т.п. На самом деле можно было рекурсивно вызывать callback функцию, но я всё же предпочёл остановиться на цикле while без тела.

PS: можно кстати всё это собрать не в массив, а в хеш, ну или словарь, кому как удобнее. Что бы на выходе получить примерно такую структуру:
Код

{
  '4' => [
           'уровень - 1',
           'уровень - 2'
         ],
  '2' => [
           'уровень - 1',
           'уровень - 2'
         ],
  '1' => [
           'уровень - 1',
           'уровень - 2'
         ],
  '3' => [
           'уровень - 1',
           'уровень - 2',
           'уровень - 3',
           'уровень - 4'
         ]
}



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1057 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.