2017-01-20 4 views
0

word-list.txt에 액세스하고 임의의 단어를 가져 오는 간단한 PHP 함수를 작성했습니다 (단어는 줄 바꿈으로 구분됩니다). 이 단어의 최대 길이는 $ maxlength 여야합니다. 필자가 작성한 방식으로 단어를 가져오고 길이가 너무 길면 $ maxlength보다 작거나 같을 때까지 새로운 단어를 계속 가져옵니다. 내가 실행중인 문제는 스크립트가 최대 실행 시간 동안 치명적인 오류를 반환한다는 것입니다. 여기 코드는 다음과 같습니다단어 목록에서 특정 길이의 임의 단어 가져 오기

function GetWord($maxlength) { 
    $file_content = file('word-list.txt'); 
    $nword = $file_content[array_rand($file_content)]; 

    while(mb_strlen($nword) > $maxlength) { 
     $nword = $file_content[array_rand($file_content)]; 
    } 

    return $nword; 
} 

나는 데이터베이스에 단어 목록을 넣고 각 해당 단어의 길이 열을 가지고있다 생각할 수있는 유일한 대안. 그러면 길이에 따라 단어 선택을 선택할 수 있습니다. 그러나 데이터베이스를 사용하지 않으려 고 노력하고 있으므로 스크립트의 문제점을 찾아 내고 싶습니다. 어떤 도움이라도 대단히 감사합니다. 감사!

+0

내가 언급해야 할 것은이 파일이 다소 크고 9,000 개가 넘는 줄을 포함한다는 것입니다. 이로 인해 주어진 제안 중 일부가 여전히 시간 종료됩니다. – bigbluehouse

답변

0

나는이 문제가 지나치게 복잡한 것을 생각합니다.

당신은 배열을

shuffle($content_array) 

셔플 내용

$content_array = explode("\n", $file_content); 

폭발 그리고 주어진 길이의 첫 번째 단어를 검색 할 수있다.

foreach($content_array as $word) { 
    if(strlen($word) == $word_length) 
     return $word; 
} 

저는 모든 것을 개인적으로 데이터베이스에 넣을 것입니다.

0

임의 인덱스를 사용하여 재 시도하는 것은 실제로 비효율적입니다.

길이 조건에 따라 줄을 필터링하여 유효한 줄만 남기고 그 줄을 뒤집어 키가 될 수 있습니다. 그런 다음 array_rand을 사용하여 임의의 키를 선택할 수 있습니다. 인스턴스화 할 때

function GetWord($maxlength) { 
    return array_rand(array_flip(array_filter(file('word-list.txt'), 
     function($line) use ($maxlength) { 
      return mb_strlen($line) <= $maxlength; 
     }))); 
} 
0

다음 클래스는 어떤 정렬을 수행하지만 다음 임의의 단어에 대한 모든 검색은 O (1) 시간이 걸리는 :이 모든는 함수형 프로그래밍 방법으로 수행 할 수 있습니다

class RandomWord { 
    private $words; 
    private $boundaries; 

    private static function sort($a, $b){ 
     return strlen($a) - strlen($b); 
    } 

    function __construct($file_name) { 
     $this->words = file($file_name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 

     // Sort the words by their lenghts 
     usort($this->words, array('RandomWord', 'sort')); 

     // Mark the length boundaries 
     $last = strlen($this->words[0]); 

     foreach($this->words as $key => $word) { 
      $length = strlen($word); 

      if ($length > $last) { 
       for($i = $last; $i < $length; $i++) { 
        // In case the lengths are not continuous 
        // we need to mark the intermediate values as well 
        $this->boundaries[$i] = $key - 1; 
       } 
       $last = $length; 
      } 
     } 
    } 

    public function get($max_length) { 
     if (isset($this->boundaries[$max_length])) { 
      return $this->words[rand(0, $this->boundaries[$max_length])]; 
     } 

     return $this->words[array_rand($this->words)]; 
    } 
} 

은 좋아 사용

$r = new RandomWord("word-list.txt"); 
$word1 = $r->get(6); 
$word2 = $r->get(3); 
$word3 = $r->get(7); 
... 

업데이트 : 지금은 그것과 작품을 테스트했습니다.