sPhrase = trim($sPhrase); $this->sPhraseType = $sPhraseType; $this->aWords = explode(' ', $this->sPhrase); $this->aWordSets = $this->createWordSets($this->aWords, 0); } public function getPhraseType() { return $this->sPhraseType; } public function getWordSets() { return $this->aWordSets; } public function addTokens(&$aTokens) { foreach ($this->aWordSets as $aSet) { foreach ($aSet as $sWord) { $aTokens[' '.$sWord] = ' '.$sWord; $aTokens[$sWord] = $sWord; } } } public function invertWordSets() { $this->aWordSets = $this->createInverseWordSets($this->aWords, 0); } private function createWordSets($aWords, $iDepth) { $aResult = array(array(join(' ', $aWords))); $sFirstToken = ''; if ($iDepth < Phrase::MAX_DEPTH) { while (sizeof($aWords) > 1) { $sWord = array_shift($aWords); $sFirstToken .= ($sFirstToken?' ':'').$sWord; $aRest = $this->createWordSets($aWords, $iDepth + 1); foreach ($aRest as $aSet) { $aResult[] = array_merge(array($sFirstToken), $aSet); } } } return $aResult; } public function createInverseWordSets($aWords, $iDepth) { $aResult = array(array(join(' ', $aWords))); $sFirstToken = ''; if ($iDepth < Phrase::MAX_DEPTH) { while (sizeof($aWords) > 1) { $sWord = array_pop($aWords); $sFirstToken = $sWord.($sFirstToken?' ':'').$sFirstToken; $aRest = $this->createInverseWordSets($aWords, $iDepth + 1); foreach ($aRest as $aSet) { $aResult[] = array_merge(array($sFirstToken), $aSet); } } } return $aResult; } };