PHP将数组/随机字生成器/拆分字符串中的值从数组中获取

时间:2018-03-25 10:58:24

标签: php arrays

我有一个句子需要随机更改花括号中的部分。重要的是,大括号内的值可以改变(就像在那里可以放任何单词一样),所以

$x = '{Please,|Just|If you can,} make so, that this 

{incredible|cool|simple|important|useless} sentence {fast|correctly|instantly} 

changed randomly every time'; //this is the string that needs to be broken up

当我使用

$parts = explode('{', $x); 

它给了我一个看起来像这样的数组

  

array([0] => [1] => {请,| Just |如果可以,}这样做,这个   [2] =>令人难以置信的|酷|简单|重要|无用}句子   [3] =>快速|正确|立即}每次随机更改)

哪个不起作用。

我所做的是:

 $parts = [

  ['Please,','Just','If you can,'], 

  ['incredible', 'cool','simple','important','useless'],

  ['fast','correctly','instantly'],

];

$p = [];

foreach ($parts as $key => $values) {

  $index = array_rand($values, 1);

  $p[$key] = $values[$index];
}


  $x_one = $p[0] . ' make it so that ' .  $p[1] . ' this sentence

changed ' . $p[2] . ' randomly every time.';

echo $x_one;  

我必须从$parts获取$x,因为字符串$x中的字词可能会发生变化。不知道从哪里去。

4 个答案:

答案 0 :(得分:4)

您可以使用preg_replace_callback()来捕获序列,使用|进行拆分并返回随机值:

$x = '{Please,|Just|If you can,} make so, that this

{incredible|cool|simple|important|useless} sentence {fast|correctly|instantly}

changed randomly every time';

// catch all strings that match with {...}
$str = preg_replace_callback('~\{([^}]+)\}~', function($matches){
    // split using |
    $pos = explode('|', $matches[1]);
    // return random element
    return $pos[array_rand($pos)];
}, $x);

echo $str;

可能的输出:

  • 如果可以的话,那么这个很酷的句子每次都会正确地改变
  • 请这样,这个很酷的句子每次都随机快速变化
  • 如果可以,那么,这个令人难以置信的句子每次都会随机快速变化

正则表达式:

\{       # { character
 (       # capture group
 [^}]+   # all character until }
 )       # end capture group
\}       # } character

答案 1 :(得分:1)

在这些情况下,正则表达式非常有用。例如,它在解析器中用于查找令牌。

在这种情况下,您希望获得花括号之间的所有子串。 这就是诀窍:

Array
(
    [0] => Array
        (
            [0] => {Please,|Just|If you can,}
            [1] => {incredible|cool|simple|important|useless}
            [2] => {fast|correctly|instantly}
        )

    [1] => Array
        (
            [0] => Please,|Just|If you can,
            [1] => incredible|cool|simple|important|useless
            [2] => fast|correctly|instantly
        )
)

输出:

'/\{([^}]*)\}/

表达式/表示:

  • \{:这可能是任何角色
  • ([^}]+):以start curly brace开头
  • \}:一切都不是大括号(括号用于隔离匹配的表达式,这就是为什么结果在数组的索引号1中)
  • /:以大括号结束
  • preg_replace:它必须与第一个字符相同

换句话说:花括号之间的任何东西。

您可以在$cfg['SaveDir']these notes处测试正则表达式。

但这还不够:你想要替换那些比赛。 preg_replace_callback可以做到这一点,但这还不够,因为你还需要调用一些函数来选择一个随机子串。 <?php $x = '{Please,|Just|If you can,} make so, that this {incredible|cool|simple|important|useless} sentence {fast|correctly|instantly} changed randomly every time'; echo preg_replace_callback( '/\{([^\}]+)\}/', function ($matches) { $options = explode('|', $matches[1]); return $options[array_rand($options)]; }, $x ); 可以做到这一点。

sqlite 3

答案 2 :(得分:0)

另一个approch看起来像这样:

{{1}}

答案 3 :(得分:0)

如果大括号内的值可以更改,事实上,最好将它们从模板中提取到数组中,就像您在问题中所做的那样。有了部分数组和模板字符串,您就可以使用array_mapstrtr

$parts = [
  '%part1%' => ['Please,','Just','If you can,'], 

  '%part2%' => ['incredible', 'cool','simple','important','useless'],

  '%part3%' => ['fast','correctly','instantly'],
];

$template = '%part1% make so, that this %part2% sentence %part3% changed randomly every time';

$result = strtr($template, array_map(function ($values) {
    return $values[array_rand($values, 1)];
}, $parts));

这是the demo