2

ある種の再帰的反復が必要だと思うシナリオがありますが、確信が持てず、再帰的コーディングの専門家ではないため、空白を描いています。

シナリオは次のとおりです。

次のような句があります。

[He|She] would [like|love|hate] to [Play Golf|Play Tennis|Play Baseball] Today.

PHP にそのフレーズを解析してもらいたい ([] ブラケット内の各セクションは、その単語またはフレーズの可能なバリエーションを表し、各可能性は | パイプで区切られている)、すべてのバリエーションを生成します。たとえば、上記は次のようになります。

He would like to Play Golf Today. 
He would like to Play Tennis Today.
He would like to Play Baseball Today.
He would love to Play Golf Today.
He would love to Play Tennis Today.
He would love to Play Baseball Today.
He would hate to Play Golf Today.
He would hate to Play Tennis Today.
He would hate to Play Baseball Today.
She would like to Play Golf Today.
She would like to Play Tennis Today.
She would like to Play Baseball Today.
She would love to Play Golf Today.
She would love to Play Tennis Today.
She would love to Play Baseball Today.
She would hate to Play Golf Today.
She would hate to Play Tennis Today.
She would hate to Play Baseball Today.

入力されたフレーズを取得し、可能なすべての文を返すように PHP コードを記述する方法を見つけようとしています。

4

4 に答える 4

0
$string = '[He|She] would [like|love|hate] to [Play Golf|Play Tennis|Play Baseball] Today.';
$parts = explode("]", $string);
$newparts = array();
$loops = array();
foreach($parts as $part){
 if(strpos($part, '[') !== false){
    $part = preg_replace("#([^\[]+)?\[#", "", $part);
    $loops[] = explode("|", $part);
 }
}
//matching other words

$words = preg_replace("#\[(.*?)\]#", '', $string);
$words = preg_replace("#\s+#", '|', trim($words));
$words = explode("|", $words);

foreach($loops as $key => &$val){

    foreach($val as &$word){
      $word = $word.' '.$words[$key];
    }
}
$data =array();

$eval = '
 $data =array();
 ';
$eval_blocks = '';
$eval_foreach = '';
$eval_data = '
$data[] = ';
$looplength = count($loops);
for($i=0; $i<$looplength; $i++){
 $eval_foreach.= '
 foreach($loops['.$i.'] as $val'.($i+1).'){
 ';
 if( ($i+1) == $looplength ){
  $eval_data .= ' $val'.($i+1).';';
 }else{
  $eval_data .= ' $val'.($i+1).' ." ".';
 }
 $eval_blocks .= '
 }
 ';
}
$eval = $eval. $eval_foreach . $eval_data . $eval_blocks;
echo "<hr>";
print_r($words);
print_r($loops);
print_r($data);

出力:

Array
(
    [0] => would
    [1] => to
    [2] => Today.
)
Array
(
    [0] => Array
        (
            [0] => He would
            [1] => She would
        )

    [1] => Array
        (
            [0] => like to
            [1] => love to
            [2] => hate to
        )

    [2] => Array
        (
            [0] => Play Golf Today.
            [1] => Play Tennis Today.
            [2] => Play Baseball Today.
        )

)
Array
(
    [0] => He would like to Play Golf Today.
    [1] => He would like to Play Tennis Today.
    [2] => He would like to Play Baseball Today.
    [3] => He would love to Play Golf Today.
    [4] => He would love to Play Tennis Today.
    [5] => He would love to Play Baseball Today.
    [6] => He would hate to Play Golf Today.
    [7] => He would hate to Play Tennis Today.
    [8] => He would hate to Play Baseball Today.
    [9] => She would like to Play Golf Today.
    [10] => She would like to Play Tennis Today.
    [11] => She would like to Play Baseball Today.
    [12] => She would love to Play Golf Today.
    [13] => She would love to Play Tennis Today.
    [14] => She would love to Play Baseball Today.
    [15] => She would hate to Play Golf Today.
    [16] => She would hate to Play Tennis Today.
    [17] => She would hate to Play Baseball Today.
)

更新: 動的に作成されたループ。

デモ: http://codepad.org/eeQd9S0r

于 2013-07-27T22:40:42.550 に答える