2014-10-05 2 views
3

Я создал функцию, которая случайно генерирует фразу из жесткокодированного списка слов. У меня есть функция get_words(), которая имеет строку жестко закодированных слов, которая превращается в массив, затем перетасовывается и возвращается.Php: Индексирование строк неустойчиво?

get_words() вызывается generate_random_phrase(), который перебирает get_words() п раз, и на каждой итерации сцепляет русское слово в заключительной фразе, которую суждено быть возвращены пользователю.

Моя проблема заключается в том, что по какой-то причине PHP продолжает давать мне непоследовательные результаты. Это дает мне слова, которые рандомизированы, но дает непоследовательное количество слов. Я указываю 4 слова по умолчанию, и это дает мне фразы в диапазоне от 1-4 слов вместо 4. Эта программа настолько проста, что почти невероятно, я не могу точно определить точный вопрос. Кажется, что сломанная ссылка в цепочке - это массив $words, который индексируется, кажется, почему-то иногда индексирование терпит неудачу. Я незнаком с PHP, может кто-нибудь объяснить это мне?

<?php 

function generate_random_phrase() { 
    $words = get_words(); 
    $number_of_words = get_word_count(); 
    $phrase = ""; 
    $symbols = "[email protected]#$%^&*()"; 
    echo print_r($phrase); 

    for ($i = 0;$i < $number_of_words;$i++) { 
    $phrase .= " ".$words[$i]; 
} 


    if (isset($_POST['include_numbers'])) 
    $phrase = $phrase.rand(0, 9); 

    if (isset($_POST['include_symbols'])) 
    $phrase = $phrase.$symbols[rand(0, 9)]; 

    return $phrase; 
} 

function get_word_count() { 
    if ($_POST['word_count'] < 1 || $_POST['word_count'] > 9) 
    $word_count = 4; #default 
    else 
    $word_count = $_POST['word_count']; 
    return $word_count; 
} 

function get_words() { 
    $BASE_WORDS = "my sentence really hope you 
    like narwhales bacon at midnight but only 
    ferver where can paper laptops spoon door knobs 
    head phones watches barbeque not say"; 
    $words = explode(' ', $BASE_WORDS); 
    shuffle($words); 
    return $words; 
} 
?> 

ответ

2

В $ BASE_WORDS ваши вкладки и новые линии занимают пространство в разобранном массиве, вот почему. Удалите новые строки и вкладки, и он будет генерировать правильный ответ. То есть:

$BASE_WORDS = "my sentence really hope you like narwhales bacon at midnight but only ferver where can paper laptops spoon door knobs head phones watches barbeque not say"; 
+0

Wow, ваш гений! благодаря –

2

Ваша функция кажется немного непоследовательно, поскольку вы также включать пробелы внутри массива, вот почему, когда вы включили их, вы включите их в цикле, который, кажется, 5 слов (4 реальные слова с одним пространственным индексом) не совсем правильно. Сначала вы можете просто фильтровать пробелы, включая пробелы.

Вот визуальное представление о том, что я имею в виду:

Array 
(
    [0] =>    // hello im a whitespace, i should not be in here since im not really a word 

    [1] => but 
    [2] => 
    [3] => bacon 
    [4] => spoon 
    [5] => head 
    [6] => barbeque 
    [7] => 
    [8] => 
    [9] => sentence 
    [10] => door 
    [11] => you 
    [12] => 
    [13] => watches 
    [14] => really 
    [15] => midnight 
    [16] => 

Итак, когда вы цикл, вы включать пробелы, в этом случае. Если у вас есть ряд слов 5, вы действительно не получите эти 5 слов, index 0 - 4 будет выглядеть так, как будто у вас всего 3 (1 => but, 3 => bacon, 4 => spoon).

Вот модифицированная версия:

function generate_random_phrase() { 
    $words = get_words(); 
    $number_of_words = get_word_count(); 
    $phrase = ""; 
    $symbols = "[email protected]#$%^&*()"; 
    $words = array_filter(array_map('trim', $words)); // filter empty words 
    $phrase = implode(' ', array_slice($words, 0, $number_of_words)); // no need for a loop 
    // this simply gets the array from the first until the desired number of words (0,5 or 0,9 whatever) 
    // and then implode, just glues all the words with space 
    // so this ensure its always according to how many words you want 

    if (isset($_POST['include_numbers'])) 
    $phrase = $phrase.rand(0, 9); 

    if (isset($_POST['include_symbols'])) 
    $phrase = $phrase.$symbols[rand(0, 9)]; 

    return $phrase; 
} 
0

Непостоянный интервал в списке слов - это проблема.

Вот исправление:

function get_words() { 
    $BASE_WORDS = "my|sentence|really|hope|you| 
|like|narwhales|bacon|at|midnight|but|only| 
|ferver|where|can|paper|laptops|spoon|door|knobs| 
|head|phones|watches|barbeque|not|say"; 
    $words = explode('|', $BASE_WORDS); 
    shuffle($words); 
    return $words; 
} 
Смежные вопросы