Just a thought: if you're going the brute-force route (and I don't have any better ideas), you really have two options:
Step through every possible permutation of the letters, and look up each one to see if it's in the dictionary.
Step through each word in the dictionary, and see if it's possible to create it using the given letters.
The second strategy would be much, much more efficient: there are probably millions of possible permutations, and only a few hundred thousand words in a relatively comprehensive English dictionary.
So I'd start by counting how many of each letter appears in the player's hand:
$hand = "WENTOETII";
$hand_letters = array();
for ( $i = 0; $i < strlen( $hand ); $i++ ) {
$this_letter = substr( $hand, $i, 1 );
$hand_letters[ $this_letter ]++;
}
/*
result:
Array(
'W' => 1,
'E' => 2,
'N' => 1,
'T' => 2,
'O' => 1,
'I' => 2
);
*/
Then, as you iterate through the words in your dictionary, you can compare the frequency of letters in the word to the frequency of letters in the player's hand. If the former is equal to or less than the latter, that word is a match. For speed, you may want to precompute the letter frequencies in your dictionary.
Of course, you'd want to eliminate from your dictionary all words that can never be made from a Countdown hand. For starters, this would include all words of more than nine letters.
If a Countdown deck contains certain numbers of certain letters, you can also eliminate words that contain more of a particular letter than the deck does. For example, if a deck contains only three S's and three E's, you can eliminate "sassafras" and "teepee". This is probably a minor issue, though.