Php阵列爆炸,内爆,随机播放

时间:2012-06-09 04:42:20

标签: php arrays

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

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

 $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);

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

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-我没有找到一种简单的方法来添加一个段落分隔符(carriege return或new line)来创建多个。所以我使用了一个简单的“for”循环。事实证明,在$ content $本身内添加carriege返回将起作用! (我想知道为什么,我认为它被视为阵列的一部分!)

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

3 个答案:

答案 0 :(得分:2)

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

$content = explode(' ', $content);
$rnd = array_rand($content, 5);
$content = implode(' ', array_intersect_key($content, array_flip($rnd)));

答案 1 :(得分: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%,每次都会产生相等长度的输出数组。

答案 2 :(得分:0)

  1. 因为shuffle接受数组的引用,并返回一个布尔值。

  2. 您可以使用rand()获取随机数。