[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Составитель альтернативных текстов
Slays
Помогите, пожалуйста. Не могу свести концы с концами в своем коде.
Вот есть у нас допустим строка:
$string = "какой-то текст {1|2|3} и {10|11}, а потом {100|200|300|400|500}";

Нужно составить и получить все возможные варианты из этого текста, считая что в фигурных скобках расположены альтернативы, разделенные прямой чертой. Например из этого текста должно получиться:

какой-то текст 1 и 10, а потом 100
какой-то текст 2 и 10, а потом 100
какой-то текст 3 и 10, а потом 100
какой-то текст 1 и 11, а потом 100
какой-то текст 2 и 11, а потом 100
какой-то текст 3 и 11, а потом 100
какой-то текст 1 и 10, а потом 200
какой-то текст 2 и 10, а потом 200
какой-то текст 3 и 10, а потом 200
какой-то текст 1 и 11, а потом 200
какой-то текст 2 и 11, а потом 200
какой-то текст 3 и 11, а потом 200
и тд, все возможные варианты строки, причем скобок и альтернативных значений может быть сколько угодна.
Такая система используется, например, для создание разных описаний сайта в системах регистрации в каталогах.


мой недокод 8(

$string = "какой-то текст {1|2|3} и {10|11}, а потом {100|200|300|400|500}";
//нахожу и записываю все значения круглых скобок в массив $aux
preg_match_all("/{(.*?)}/", $string, $aux, PREG_PATTERN_ORDER);
/*
Array
(
[0] => {1|2|3}
[1] => {10|11}
[2] => {100|200|300|400|500}
)
*/
//разбиваю значения круглых скобок в массив

foreach($aux['1'] as $key => $value){
$alter_tag[] = explode("|", $aux['1'][$key]);
}
/*
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => 10
[1] => 11
)
[2] => Array
(
[0] => 100
[1] => 200
[2] => 300
[3] => 400
[4] => 500
)
)
*/
//неправильный цикл - никак не могу придумать взаимодействие между циклами
// в цикле я пытаюсь пройти по массиву и заменить с помощью str_replace соответствующую круглую скобку одним из ее значений

for($i=0; $i<count($alter_tag); $i++){
for($j=0; $j<count($alter_tag[$i]);$j++){
$string = str_replace($aux['0'][$i], $alter_tag[$i][$j], $string);
$str[] = $string;
}
}

echo "<pre>";
print_r($str);


Может есть и другой способ как это реализовать, подскажите, важен лишь результат, а именно, рабочий скрипт.



Спустя 24 минуты, 35 секунд (1.07.2010 - 12:56) linker написал(а):
На коленке, зато работает
$string = "какой-то текст {1|2|3} и {10|11}, а потом {100|200|300|400|500}";
preg_match_all("/{(.*?)}/", $string, $aux, PREG_PATTERN_ORDER);
$alter_tag = array();
$replaced1 = $aux[0][0];
$replaced2 = $aux[0][1];
$replaced3 = $aux[0][2];
foreach($aux['1'] as $key => $value)
{
$alter_tag[] = explode("|", $aux['1'][$key]);
}
$end = count($alter_tag) - 1;
$a1 = $alter_tag[0];
$a2 = $alter_tag[1];
$a3 = $alter_tag[2];
$len3 = count($a3);
$len2 = count($a2);
$len1 = count($a1);
for($index3 = 0; $index3 < $len3; $index3 ++)
{
$var3 = $a3[$index3];
for($index2 = 0; $index2 < $len2; $index2 ++)
{
$var2 = $a2[$index2];
for($index1 = 0; $index1 < $len1; $index1 ++)
{
$var1 = $a1[$index1];
$temp = str_replace($replaced3, $var3, $string);
$temp = str_replace($replaced2, $var2, $temp);
$temp = str_replace($replaced1, $var1, $temp);
echo $temp . '<br>';
}
}
}

Спустя 3 минуты, 46 секунд (1.07.2010 - 12:59) Slays написал(а):
linker, супер !!! Спасибо !!
Сейчас разберусь и посмотрю какая модернизация нужна, если нужна )

Спустя 9 минут, 6 секунд (1.07.2010 - 13:08) DedMorozzz написал(а):
http://phpforum.ru/index.php?showtopic=29002&st=0 - там куча решений.

Спустя 5 минут, 22 секунды (1.07.2010 - 13:14) DedMorozzz написал(а):
Кстати, linker, если хо - добавь туда своё.

Спустя 6 минут, 17 секунд (1.07.2010 - 13:20) linker написал(а):
DedMorozzz, да я не против, только данная задача не совсем по той теме, вроде. Да и сама реализация грустная.

Спустя 5 минут, 59 секунд (1.07.2010 - 13:26) DedMorozzz написал(а):
"там" рандом, "тут"- перебор. Вот и всё отличие.
Цитата
Да и сама реализация грустная
какая именно? Даже если и все - покажи как надо laugh.gif

Спустя 1 час, 26 минут, 12 секунд (1.07.2010 - 14:52) Slays написал(а):
осталось модернизировать код, чтобы соблюдалось условие:
скобок и альтернативных значений может быть сколько угодна, да и вложения во вложениях было бы не плохо попробовать сделать )

{1|2|{3|4}} и глубже )

Спустя 2 минуты, 38 секунд (1.07.2010 - 14:55) DedMorozzz написал(а):
Тю, я те дал ссылку, где решена такая задача, с точностью до 98%
Причём приведены скорости каждого из скриптов. Можешь выбрать себе найболее подходящий.

Спустя 10 минут, 54 секунды (1.07.2010 - 15:06) Slays написал(а):
я посмотрел конечно же, спасибо ) но там везде, как я понял, рандом.
А меня интересует именно перебор и вывод всех возможных значений.

можно конечно каждый полученный рандом сравнивать с ранее составленными, и если такой вариант уже есть - его не записывать, но это не рационально.

Спустя 17 минут, 52 секунды (1.07.2010 - 15:24) DedMorozzz написал(а):
Ну я и написал, что не на 100%, а на 98% похожа задача. 2% сам переделай.

Спустя 57 минут, 35 секунд (1.07.2010 - 16:21) Slays написал(а):
Рандом я бы и сам без проблем сделал, но задача как и логика программы здесь и там вообще разные, если только наоборот там посмотреть 2% готового кода, а 98 переделать...

Спустя 1 день, 20 часов, 49 минут, 28 секунд (3.07.2010 - 13:11) Slays написал(а):
тема еще актуальна, эксперты подключайтесь пожалуйста )
Или в другом разделе тему открыть, ато задача посложнее начинающих


_____________
если помог, не скупись на карму =)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.