PDA

Просмотр полной версии : [php] размножение текста


FreShBY
16.06.2009, 11:17
Добрый день.

Хочу написать размножение текста. Но что-то не получается.

Есть строка: [Привет/Здравствуй], [Артём/Миша/Саша/Паша/Даша/Петя/И другие]

На выводе должно быть:
Привет, Артём
Привет, Миша
Привет, Саша
Привет, Паша
Привет, Даша
Привет, Петя
Привет, И другие
Здравствуй, Артём
Здравствуй, Миша
Здравствуй, Саша
Здравствуй, Паша
Здравствуй, Даша
Здравствуй, Петя
Здравствуй, И другие

Для этого написал скрипт:
$formyla = "[Привет/Здравствуй], [Артём/Миша/Саша/Паша/Даша/Петя/И другие]";
preg_match_all('/\[(.*?)\]/i', $formyla, $out);
foreach($out[1] as $key => $value)
{
$words = explode('/', $value);

foreach($words as $key2 => $value2)
{
echo str_replace("[".$value."]", $value2, $formyla)."<br>";
}
}


Но тут появилась проблема. Оно выводит:
Привет, [Артём/Миша/Саша/Паша/Даша/Петя/И другие]
Здравствуй, [Артём/Миша/Саша/Паша/Даша/Петя/И другие]
[Привет/Здравствуй], Артём
[Привет/Здравствуй], Миша
[Привет/Здравствуй], Саша
[Привет/Здравствуй], Паша
[Привет/Здравствуй], Даша
[Привет/Здравствуй], Петя
[Привет/Здравствуй], И другие

Попробовал строчку: Привет, [Артём/Миша/Саша/Паша/Даша/Петя/И другие]

Выводит: Привет, Артём
Привет, Миша
Привет, Саша
Привет, Паша
Привет, Даша
Привет, Петя
Привет, И другие

Не работает размножение если в этой строчке есть 2 разных [].

Может кто знает решение?

FireFenix
16.06.2009, 11:40
<?php

$string = '[Привет/Здравствуй], [Артём/Миша/Саша/Паша/Даша/Петя/И другие]';
preg_match_all('/\[(.*?)\]/i', $string, $match);

$action = explode('/', $match[1][0]);
$names = explode('/', $match[1][1]);

for($j = 0; $j < count($action); $j++)
{
for($k = 0; $k < count($names); $k++)
{
echo($action[$j] . ', ' . $names[$k] . '<br>');
}
}

?>

mailbrush
16.06.2009, 11:56
FireFenix, омг. FreShBY, юзай:
<?
$words=array('Привет','Здраствуй');
$names=array('Артём','Миша','Саша',' аша','Даша','Петя','И другие');
foreach($words as $word)
foreach($names as $name)
echo $word.', '.$name."<br>\r\n";
?>

wildshaman
16.06.2009, 11:57
mailbrush, Посмотри, в каком виде исходная строка.

mailbrush
16.06.2009, 12:08
Если учитывать исходную строку, тогда так:<?php
$string='[Привет/Здравствуй], [Артём/Миша/Саша/Паша/Даша/Петя/Другие]';
preg_match_all('#\[(.*?)\]#',$string,$match);
$words=explode('/',$match[1][0]);
$names=explode('/',$match[1][1]);
foreach($words as $word)
foreach($names as $name)
echo $word.', '.$name."<br>\r\n";
?>
FireFenix, так и не юзаешь форич.

FreShBY
16.06.2009, 12:09
А если [] Таких скобок будет в тексте неизвестное количество? Т.е. текст будет вводить каждый раз разные и разными людьми?

mailbrush
16.06.2009, 12:20
Нет, в этом случае только две скобки. Но можно сделать анлим.

Trieg
16.06.2009, 12:29
похоже ТС хочет сделать рандомизатор текста.. ели так то вот готовый http://xbb.uz/randomizator/

FreShBY
16.06.2009, 13:01
Мне нужен свой. Мне в движой свой и для своих целей.

FreShBY
16.06.2009, 14:31
Нужно каким то рекурсивным выводом делать ... а как ... не знаю

FireFenix
16.06.2009, 17:00
FireFenix, так и не юзаешь форич.
Какая разница что юзать? Темболее здесь результат preg_match возвращает не ассоциативный массив.

Нужно каким то рекурсивным выводом делать ... а как ... не знаю
Первое, что пришло в голову :
<?php

$string = '[Привет/Здравствуй], [Артём/Миша/Саша/Паша/Даша/Петя/И другие], [Гулять/Пить/Курить]';
preg_match_all('/\[(.*?)\]/i', $string, $match);

$action = explode('/', $match[1][0]);
$names = explode('/', $match[1][1]);

recursion($match, $element, 0, count($match[0]) - 1);

function recursion($match, $element, $level, $max_level)
{
$data = explode('/', $match[1][$level]);

for ($i = 0; $i < count($data); $i++)
{
$element[$level] = $data[$i];

if ($level !== $max_level)
{
recursion($match, $element, $level + 1, $max_level);
} else {
echo(implode(', ', $element) . '<br>');
}
}
}

?>