【问题标题】:Php Array explode , implode, shufflePhp 数组爆炸、内爆、洗牌
【发布时间】:2012-06-09 04:42:20
【问题描述】:

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

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

 $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 - 如何随机定义要从数组中删除的单词数

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

** 更新我 **

首先,感谢所有 cmets 的回答!

我最终得到了这个:

   $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 大师会选择的方式, - 但我学到了很多东西,这是最重要的 - 感谢所有人!

【问题讨论】:

  • shuffle() 根据 shuffle 是否成功返回一个布尔值。所以在第一个例子中,$content 在第 2 行之后不再是一个数组。
  • 如果你想要其他方法,看看这个。 *.com/questions/2695981/php-get-random-paragraph
  • 对于#2,我可能会定义一个返回 boolean 的函数,返回 true 与我想让单词“停留”的相同分布。然后使用array_filter(),将我的函数指定为回调参数。
  • @ÉrikRykDesjardins - 感谢您的链接,我之前已经看过了 :-) 我想做一些适合我不存在的能力的简单事情 :-) 但这就是学习的方式!谢谢。
  • 关于您上次的编辑以及您关于$content 中的回车是否成为数组元素的问题,答案是它们是。你exploding() 通常不是在空格上,而是在一个空格上。如果您有字符串“No\nSpaces\nHere”,explode() 将产生一个长度为 1 的数组,而不是您可能期望的 3。如果你想“分解”一个基于空格的字符串,请考虑$b = preg_split("/\s/", $a);

标签: php arrays


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这就是我所说的关于 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% 将始终被丢弃,从而导致每次输出数组的长度相等。

    【讨论】:

    • 哇!谢谢 。这对我的需求来说有点太复杂了,但并非如此 - 这显然是一种更复杂的方法来实现这一点。通过在您的示例中添加$drop_percent = mt_rand(0, 99)/100;,也很容易随机化该因素。
    • 关于接受 - 我不想不接受 @bsdnoobz 已经接受的答案,因为我不能接受其中两个,我只能投票赞成答案(和 cmets)
    • @Obmerk,别担心——我发帖是为了在您的评论中回答您的问题,而不是窃取复选标记。希望它有所帮助:-)
    【解决方案3】:
    1. 因为shuffle 接受一个数组的引用,并返回一个布尔值。

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

    【讨论】:

    • 感谢您的回复! 1 - 就像我在其他 cmets 中所说的,我是一个新手。我仍然不太清楚这两种语法之间的区别是什么。也许是语义,但我想理解,以免重犯同样的错误。 2- 像我一样新手,我知道 rand() :-) 但是如何应用它以便从所述数组中随机删除单词 - 这是一个不同的故事。
    • 为了整体效率,我建议在需要 rand() 的情况下使用 mt_rand()。它更快,更随机。