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-配列から削除する単語の数をランダムに定義する方法

(ランダムな長さ/単語数を作成するために?)

**更新I**

まず第一に、すべてのコメントの答えに感謝します!

私はこれで終わった:

   $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()を追加しました。これがないと、ランド番号が単語数よりも大きい場合にエラーが発生する可能性があるためです。

「2番目の引数は1と配列内の要素の数の間でなければなりません」

(実際、PHPがそのようなエラーを自動的に無視しないのは奇妙ですが、気にしないでください。)

2-段落区切り文字(キャリッジリターンまたは改行)を追加して複数の段落を作成する簡単な方法が見つかりませんでした。そのため、単純な「for」ループを使用しました。$ content $自体の中にキャリッジリターンを追加すると、うまくいくことがわかります。(理由を知りたいのですが、配列の一部としてカウントされていると思います!)

とにかく-私はそれが原始的な方法であり、多くのphpの達人が選ぶものではないことを知っています、-しかし私は多くを学びました、そしてそれは最も重要なことです-すべてのおかげで!

4

3 に答える 3

2

shuffle()配列引数をランダム化しますが、ブール値を返します。を使用array_rand()して、配列から 1 つ以上のランダムなエントリを選択できます。

$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

 */

2 つの主な違いは、前者では各単語が 20% の確率でドロップされるため、実行するたびに異なる長さの出力配列になる可能性があることです。単語が削除されない可能性があります (可能性は低いですが)。

2 番目では、単語の 20% が削除されます。これは確かです。どの 20% かはランダムなシャッフルに依存しますが、20% は常にドロップされるため、毎回同じ長さの出力配列になります。

于 2012-06-09T17:37:00.587 に答える
0
  1. shuffle配列の参照を受け入れ、ブール値を返すためです。

  2. rand()乱数を取得するために使用できます。

于 2012-06-09T04:46:03.013 に答える