2012-06-09 4 views
0

Я хотел сделать очень быструю функцию для создания случайного абзаца.Php Array explode, implode, shuffle

Так что я думал, что лучший способ - взять существующий, взорваться, перетасовать и взорвать.

$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 - как случайным образом определить количество слов, чтобы выпасть из массива

(для того, чтобы создать случайную длину/количество слов ?)

** UPDATE I **

Прежде всего, спасибо всем комментарии swers!

Я закончил с этим:

$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- я добавил счетчик(), потому что без него я мог получить ошибку, если число рандов больше, чем количество слов.

«Второй аргумент должен быть между 1 и числом элементов в массиве»

(на самом деле это странно, что PHP не automtically игнорировать такую ​​ошибку. - но фигу)

2- Я не нашел простой способ добавить разделитель абзацев (возврат карри или новую строку), чтобы создать более одного. поэтому я использовал простой «для». оказывается, что добавление возврата карри в пределах $ content $ само по себе будет работать! (! Я хотел бы знать, почему, я думаю, что в настоящее время рассматривается как часть массива)

Во всяком случае - я знаю, что это примитивный способ, а не то, что многие PHP гуру выбрал бы, - но я узнал много, и это самое главное - спасибо всем!

+1

'shuffle()' возвращает логическое значение, основанное на успешности тасования. Итак, в первом примере '$ content' больше не является массивом после строки 2. – jedwards

+1

Если вы хотите использовать другой подход, взгляните на это. http://stackoverflow.com/questions/2695981/php-get-random-paragraph –

+0

И для # 2 я бы, вероятно, определил функцию, которая возвращает логическое значение, возвращая true с тем же распределением, которое я хотел бы передать словами " оставаться". Затем используйте 'array_filter()', указав мою функцию как параметр обратного вызова. – jedwards

ответ

2

shuffle() будет рандомизировать аргумент массива, но он возвращает логическое значение. Вы можете использовать array_rand(), чтобы выбрать одну или несколько случайных записей из массива.

$content = explode(' ', $content); 
$rnd = array_rand($content, 5); 
$content = implode(' ', array_intersect_key($content, array_flip($rnd))); 
0
  1. Поскольку shuffle принимает ссылку массива и возвращает логическое значение.

  2. Чтобы получить случайное число, вы можете использовать rand().

+0

благодарит за ответ! 1 - как я уже сказал в других комментариях, я полный новичок. Мне все еще не очень понятно, в чем разница между двумя синтаксисами. возможно, это семантика, но я хочу понять, чтобы не повторять те же ошибки. 2- как новичок, как я, rand() Я знаю :-), но как его применять, чтобы случайно отбросить слова из указанного массива - это совсем другая история. –

+0

Для общей эффективности я предлагаю в случаях, когда вам нужен rand(), вместо этого используйте mt_rand(). Это намного быстрее и случайнее. – Dandy

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% всегда будут отброшены, в результате получая массивы вывода равной длины каждый раз.

+0

Вау! Благодарю . это слишком сложно для моих потребностей, но не менее - это, очевидно, более сложный способ достичь этого. Добавляя '$ drop_percent = mt_rand (0, 99)/100;' к вашему примеру легко достаточно, чтобы рандомизировать этот фактор. –

+0

Что касается принятия - я бы не хотел принимать уже принятый ответ @bsdnoobz, и поскольку я не могу принять два из них, я могу только ответить (и комментарии) –

+0

@Obmerk, не беспокойтесь - я отправил чтобы ответить на ваш вопрос в своем комментарии, а не украсть галочку. Надеюсь, это помогло :-) – jedwards