0

我想做一个非常快速的函数来创建一个随机段落。

所以我想,最好的方法是采用现有的,爆炸,洗牌和内爆。

 $content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation .';

   $content = explode(" ", $content);
   shuffle ($content);
   $content = implode(" ", $content);

它有效,但它在我脑海中产生了 2 个问题。

1 - 为什么这不起作用:?

   $content = explode(" ", $content);
   $content = shuffle ($content);
   $content = implode(" ", $content);

这确实有效:

   $content = explode(" ", $content);
   shuffle ($content);
   $content = implode(" ", $content);

2 - 如何随机定义要从数组中删除的单词数

(为了创建一个随机长度/字数?)

** 更新我 **

首先,感谢所有评论的答案!

我最终得到了这个:

   $content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 

 Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?

   ';
   $rand_y = rand(1, 5);// rand number for the loop
   for ($b=1; $b<=$rand_y; $b++) { // repeat random times (to create paragraphes)
   $content = explode(' ', $content);
   $count = count($content) ; // word count - otherwise can return error
   $rand_x = rand(40,$count); // min 20 words , max = word count in paragraph
   $rnd = array_rand($content, $rand_x); // answer from @bsdnoobz
   $content = implode(' ', array_intersect_key($content, array_flip($rnd)));
}

1-我添加了count(),因为如果没有它,如果rand数大于字数,我可能会收到错误。

“第二个参数必须介于 1 和数组中的元素数之间”

(实际上奇怪的是 PHP 不会自动忽略这样的错误 - 但没关系。)

2-我没有找到一种简单的方法来添加段落分隔符(回车符或换行符)来创建多个 . 所以我使用了一个简单的“for”循环。事实证明,在 $content$ 本身中添加回车是可行的!(我想知道为什么,我认为它被算作数组的一部分!)

无论如何 - 我知道这是一种原始方式,而不是许多 php 大师会选择的方式, - 但我学到了很多,这是最重要的 - 感谢所有人!

4

3 回答 3

2

shuffle()将随机化数组参数,但它返回一个布尔值。您可以使用array_rand()从数组中选择一个或多个随机条目。

$content = explode(' ', $content);
$rnd = array_rand($content, 5);
$content = implode(' ', array_intersect_key($content, array_flip($rnd)));
于 2012-06-09T04:54:50.437 回答
1

这就是我所说的关于array_filter().

<?php
$content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 

 Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?';

function drop_word($word)
{
    $drop_percent = 20;  # I want there to be a 20% chance that I drop the word.
    if(rand(0,99) < $drop_percent)
    {
        printf("Dropping %s\n", $word);
        return false;           # Drop the word by returning false
    }
    else
    {
        return true;            # Keep the word by returning true
    }
}


$word_array  = explode(" ", $content);

shuffle($word_array);   # $word_array is now shuffled
printf('$word_array has %d elements.'."\n", count($word_array));
$filtered_word_array = array_filter($word_array, "drop_word");
printf('$filtered_word_array has %d elements.'."\n", count($filtered_word_array));
$filtered_content = implode(" ", $word_array);
echo "\n";
echo "New paragraph:\n";
echo $filtered_content;

/*
== OUTPUT ==

$word_array has 199 elements.
Dropping exercitation
Dropping dolore
Dropping molestiae
Dropping sint
Dropping enim
Dropping dolorem
Dropping est,
Dropping ipsum
Dropping laboris
Dropping eu
Dropping aut
Dropping ipsa
Dropping consequatur,
Dropping nisi
Dropping cupidatat
Dropping aut
Dropping Nemo
Dropping fugiat
Dropping amet,
Dropping enim
Dropping proident,
Dropping ut
Dropping labore
Dropping irure
Dropping fugiat
Dropping magni
Dropping consequat.
Dropping quia
Dropping fugit,
Dropping voluptatem
Dropping ea
Dropping Ut
Dropping Neque
Dropping anim
Dropping sed
Dropping laborum.
Dropping in
Dropping exercitationem
$filtered_word_array has 161 elements.

New paragraph:
aperiam, adipisci deserunt eiusmod veniam, voluptas dolor tempora exercitation mollit adipisicing numquam est voluptatem. sit Duis porro sit nulla voluptatem ab dolore molestiae sint beatae tempor natus totam enim quisquam dolorem laboriosam, dicta est, in ipsum qui laboris unde id sed incidunt ea reprehenderit quae nihil autem accusantium nesciunt. vel ea quaerat qui ut ex ratione sequi Lorem pariatur? suscipit eu enim Ut quo aut dolor ut sit pariatur. aspernatur quasi commodo ut ipsa consequatur, ipsam aute quia quia qui sunt elit, nisi sed cupidatat iste aliquid esse nisi labore consectetur, iure modi esse velit et doloremque ad quia aut velit, ipsum consequuntur Quis ut eum Nemo nulla eum illo cillum ullamco fugiat ullam dolore qui minima in voluptas amet, rem Excepteur enim proident, quam ad et qui consectetur ex dolore ut dolores quis eius velit aliqua. magna reprehenderit nostrud occaecat labore inventore in eos irure aliquam sit architecto fugiat magni consequat. incididunt quia fugit, illum aliquip corporis Sed voluptatem sunt eaque non error omnis ea Ut vel Neque culpa voluptate dolorem minim anim do nostrum odit sed veniam, perspiciatis laborum. amet, veritatis non explicabo. voluptate officia dolor quis consequatur? voluptatem commodi et in 

 vitae exercitationem magnam laudantium,
 */

我留下了回调函数,drop_word()为了便于理解而写得很详细。另外,我发表了一些printf()声明来说明发生了什么。如果你真的要做这样的事情,你会想要删除那些。

此外,这是另一种可能更容易的方法:

<?php
$content = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 

 Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?';

$drop_percent = 0.2;    # A decimal number representing the percentage of words you want to drop
                        # 0.2 = 20% (Must be between 0.0 and 1.0)

$word_array  = explode(" ", $content);

shuffle($word_array);   # $word_array is now shuffled
printf('$word_array has %d elements.'."\n", count($word_array));
$filtered_word_array = array_slice($word_array, 0, count($word_array) * (1-$drop_percent));
printf('$filtered_word_array has %d elements.'."\n", count($filtered_word_array));
$filtered_content = implode(" ", $word_array);
echo "\n";
echo "New paragraph:\n";
echo $filtered_content;

/*

== OUTPUT ==

$word_array has 199 elements.
$filtered_word_array has 159 elements.

New paragraph:
et ratione exercitationem eaque consequatur, labore ea ea fugiat ullamco illum ab numquam quia ut eum voluptatem. nulla consequatur? vitae qui non nesciunt. ipsum ad incidunt voluptatem inventore enim consequat. in incididunt voluptatem eos ipsam minima laboris Nemo ut quia quia in sit quam sunt est cillum ea reprehenderit dolor aspernatur voluptas in aut sit nisi adipisci et nostrum anim dolore perspiciatis magni doloremque qui laudantium, labore id amet, eius voluptas Lorem officia esse autem tempora ex omnis do dolore consectetur, iste Ut laborum. laboriosam, natus aliquid dolor amet, velit sed nihil sit cupidatat non porro minim vel sequi adipisicing aut quo quae dolorem irure enim culpa ut quaerat est, qui nulla ullam veniam, sed quasi consequuntur in veniam, occaecat molestiae fugiat quia qui iure veritatis architecto ad voluptate magna suscipit voluptate et vel accusantium modi dolorem pariatur. ex aliquip explicabo. tempor quis beatae velit commodo magnam sit aliquam sint illo error unde aliqua. dolor nisi sunt eum Ut consectetur 

 aperiam, qui Quis exercitation aute voluptatem eu odit nostrud sed elit, Neque corporis eiusmod ut quisquam esse ut ipsum quis ipsa pariatur? Excepteur velit, dolores reprehenderit deserunt Duis rem proident, totam Sed dicta enim commodi fugit, mollit dolore

 */

两者的主要区别在于,对于第一个,每个单词都有 20% 的机会被丢弃,这可能导致每次运行时输出数组的长度不同。有可能(尽管不太可能)不会丢弃任何单词。

使用第二个,消除了 20% 的单词。这是肯定的。其中 20% 将取决于随机改组,但 20% 将始终被丢弃,从而导致每次输出数组的长度相等。

于 2012-06-09T17:37:00.587 回答
0
  1. 因为shuffle接受一个数组的引用,并返回一个布尔值。

  2. 你可以rand()用来获取一个随机数。

于 2012-06-09T04:46:03.013 回答