[php] размножение текста

Discussion in 'PHP' started by FreShBY, 16 Jun 2009.

  1. FreShBY

    FreShBY Banned

    Joined:
    3 May 2009
    Messages:
    24
    Likes Received:
    3
    Reputations:
    0
    Добрый день.

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

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

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

    Для этого написал скрипт:
    Code:
    $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 разных [].

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

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    PHP:
    <?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>');
      }
    }

    ?>
     
  3. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    FireFenix, омг. FreShBY, юзай:
    PHP:
    <?
    $words=array('Привет','Здраствуй');
    $names=array('Артём','Миша','Саша','Паша','Даша','Петя','И другие');
    foreach(
    $words as $word)
        foreach(
    $names as $name)
            echo 
    $word.', '.$name."<br>\r\n";
    ?>
     
  4. wildshaman

    wildshaman Elder - Старейшина

    Joined:
    16 Apr 2008
    Messages:
    477
    Likes Received:
    483
    Reputations:
    99
    mailbrush, Посмотри, в каком виде исходная строка.
     
  5. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Если учитывать исходную строку, тогда так:
    PHP:
    <?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, так и не юзаешь форич.
     
    #5 mailbrush, 16 Jun 2009
    Last edited: 16 Jun 2009
  6. FreShBY

    FreShBY Banned

    Joined:
    3 May 2009
    Messages:
    24
    Likes Received:
    3
    Reputations:
    0
    А если [] Таких скобок будет в тексте неизвестное количество? Т.е. текст будет вводить каждый раз разные и разными людьми?
     
  7. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Нет, в этом случае только две скобки. Но можно сделать анлим.
     
  8. Trieg

    Trieg Elder - Старейшина

    Joined:
    26 Oct 2007
    Messages:
    82
    Likes Received:
    9
    Reputations:
    0
    похоже ТС хочет сделать рандомизатор текста.. ели так то вот готовый http://xbb.uz/randomizator/
     
  9. FreShBY

    FreShBY Banned

    Joined:
    3 May 2009
    Messages:
    24
    Likes Received:
    3
    Reputations:
    0
    Мне нужен свой. Мне в движой свой и для своих целей.
     
  10. FreShBY

    FreShBY Banned

    Joined:
    3 May 2009
    Messages:
    24
    Likes Received:
    3
    Reputations:
    0
    Нужно каким то рекурсивным выводом делать ... а как ... не знаю
     
  11. FireFenix

    FireFenix Elder - Старейшина

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Какая разница что юзать? Темболее здесь результат preg_match возвращает не ассоциативный массив.

    Первое, что пришло в голову :
    PHP:
    <?php

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

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

    recursion($match$element0count($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>');
        }
      }
    }

    ?>
     
    #11 FireFenix, 16 Jun 2009
    Last edited: 16 Jun 2009