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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор строки типа "текст [вариант1|вариант2]" 
:(
    Опции темы
ST_Falcon
Дата 7.12.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

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



нужно написать алгоритм обработки строки

"Регистрация в [поисковых системах|рейтингах|каталогах] с помощью [удобной|качественной] программы AllSubmitter [Yo!|PS!|Brrrrr...] вотЪ!"

который будет генерить строки
Регистрация в поисковых системах с помощью...
Регистрация в поисковых рейтингах с помощью...
Регистрация в поисковых каталогах с помощью...

без повторов

я замаялся уже... пробовал вот так

Код

<?php

$a = "Регистрация в [поисковых системах|рейтингах|каталогах] с помощью [удобной|качественной] программы AllSubmitter [Yo!|PS!|Brrrrr...].";

$mas = split ('[]\[]', $a);

$count = 1;

/*
$current - id масиву $mas який обробляється вперше

*/

foreach($mas as $k=>$v)
{
    if(strstr($v, "|")){
      $mas[$k] = split("\|", $v);
      $key[] = $k;
      $k_id[$k] = 0;
//      $max[$k] = count($mas[$k])-1;
      $count = $count * count($mas[$k]);
    }
}

$current = count($key)-1;

for($i=0; $i<$count; $i++)
{
  echo "<br>current=$current<br>";
    foreach($mas as $k=>$v)
    {
        if(is_array($mas[$k]))
        {
          echo get_key($k);
        }
       // else
         // echo $v;
    }
    echo "<br>";
}

function get_key($k)
{
  global $current, $key, $k_id, $mas;

  $r=$k_id[$k];

  if($key[$current]==$k)
  {
      // якщо поточний дор макс то зміщуєм карент на 1
      // збільшуємо на 1 або занулюєм k_id
      $k_id[$k]= $k_id[$k]+1;
      if($k_id[$k] == count($mas[$k]))
      {
          $k_id[$key[$current]]=0;
//          echo "<br>current change<br>";
          $current--;
          $k_id[$key[$current]] = $k_id[$key[$current]]+1;
      }
  }

  if($key[$current]<$k)
  {
 //     echo "<br>---------<br>";
      // збільшуємо на 1 або занулюєм k_id
      $k_id[$k]= $k_id[$k]+1;
      if($k_id[$k] == count($mas[$k]))
          $k_id[$k]=0;
  }
  return $r;
}

echo "<pre>";
echo "key<br>";
print_r($key);
echo "k_id<br>";
print_r($k_id);
echo $current;

?>


это последние потуги... может кто то пробовал делать что то подобное или знает готовый алгоритм  smile 
PM MAIL ICQ   Вверх
Mal Hack
Дата 7.12.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



ST_Falcon, полностью перебор?
Вырежи регулярками все фрагменты, а потом простым вайлом и вложенным фором (двумя, на вскидку) генерируй текст.
PM ICQ   Вверх
ST_Falcon
Дата 7.12.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

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



Mal Hack, сделал одним фором. алгоритм получился очень мутный. но работает как часы...

завтра скину.
PM MAIL ICQ   Вверх
ST_Falcon
Дата 8.12.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 14.11.2003
Где: Львов

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



Код

<?php

Error_Reporting(E_ALL & ~E_NOTICE);

$a = "тема: [привет|пока] [Лена|Вася|Оля]";
// create globall array
$mas = split ('[]\[]', $a);
// all variants
$av = 1;

foreach($mas as $k=>$v)
{
     if(strstr($v, "|"))
    {
      $v = split(('\|'), $v);
      $max[] = count($v);
      // image array
      $im[] = $v;
      // counter max array
      $cm[] = $av;
      // all variants
      $av = $av * count($v);

    }
    else
    {
      // arraya real
      $rl[] = $v;
    }
}

// counter current
$cc = $cm;

// mask array
$mask = array_fill(0, count($im), 0);
$mask[0] = 1;

// current array
$current = array_fill(0, count($im), 0);

//$av=6;

for($i=0; $i<$av; $i++)
{
    foreach($im as $k=>$v)
    {
        echo $rl[$k];
        echo $im[$k][get_variant_id($k)]." ";
    }
    echo "<br>";
}

function get_variant_id($k)
{
  global $max, $current, $mask, $cc, $cm;
  $r = $current[$k];

  if($mask[$k]!=0)
  {
      $cc[$k]--;

      // if current cuonter nulled
      if($cc[$k]==0) {
        $current[$k]++; // increment current element
        $cc[$k] = $cm[$k]; // restore current counter

        // если id текущего привысил макс id
        if($current[$k]==$max[$k]) {
          $current[$k]=0; // зануляем id текущего
          if($mask[$k+1]==0) {
              $mask[$k+1]=1;
              $cc[$k+1]=1;
          }
        }

      }
  }

  return $r;
}

echo "<pre>";
//print_r($mas);
//echo "статический массив";
//print_r($rl);
echo "<br><b>вариантов:</b> $av<br>";

echo "<br><b>текущий елемент</b><br>";
print_r($current);

echo "<br><b>кол. вариантов</b><br>";
print_r($max);

echo "<br><b>маска</b><br>";
print_r($mask);

echo "<br><b>count max</b><br>";
print_r($cm);

echo "<br><b>count current</b><br>";
print_r($cc);

echo "<br><b>динамический массив</b><br>";
print_r($im);



?>


и результат:
Цитата

тема: привет Лена
тема: пока Лена
тема: привет Вася
тема: пока Вася
тема: привет Оля
тема: пока Оля


вариантов: 6

текущий елемент
Array
(
    [0] => 0
    [1] => 0
)

кол. вариантов
Array
(
    [0] => 2
    [1] => 3
)

маска
Array
(
    [0] => 1
    [1] => 1
    [2] => 1
)

count max
Array
(
    [0] => 1
    [1] => 2
)

count current
Array
(
    [0] => 1
    [1] => 2
    [2] => 1
)

динамический массив
Array
(
    [0] => Array
        (
            [0] => привет
            [1] => пока
        )

    [1] => Array
        (
            [0] => Лена
            [1] => Вася
            [2] => Оля
        )

)


правда если задать много динамический параметров, то время генерации существенно возрастает smile

кто сделает лучше?  smile 
PM MAIL ICQ   Вверх
Mal Hack
Дата 8.12.2006, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



ST_Falcon, дай точный формат строки, которую надо преобразовать и во что...
PM ICQ   Вверх
Aliance
Дата 10.12.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Мне кажется нужно вырезать то, что внутри [], а потом explode сделать по |
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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