如何从PHP中的数组中获取以给定字母开头的随机单词?

如何从PHP中的数组中获取以给定字母开头的随机单词?,php,Php,我在PHP中创建了一个由20个单词组成的数组。有没有办法从这个数组中提取一个以特定字母开头的随机单词 例如,如果我想要一个以B开头的单词,说 $arr=array('apple','almond','banana','boat','carrot'); 然后它会一半时间返回香蕉,一半时间返回船 如何从该数组中获取以给定字母开头的随机单词?快速和肮脏,给你: function returnRandomWithLetter($words, $letter) { // put all wor

我在PHP中创建了一个由20个单词组成的数组。有没有办法从这个数组中提取一个以特定字母开头的随机单词

例如,如果我想要一个以B开头的单词,说

$arr=array('apple','almond','banana','boat','carrot');
然后它会一半时间返回香蕉,一半时间返回船


如何从该数组中获取以给定字母开头的随机单词?

快速和肮脏,给你:

function returnRandomWithLetter($words, $letter)
{

    // put all words in different bins, one for each different starting letter
    $bins = array();

    foreach($words as $word)
    {

        $bins[$word[0]][] = $word;

    }

    // return random component from chosen letter's bin 
    return $bins[$letter][array_rand($bins[$letter])];

}

快脏,给你:

function returnRandomWithLetter($words, $letter)
{

    // put all words in different bins, one for each different starting letter
    $bins = array();

    foreach($words as $word)
    {

        $bins[$word[0]][] = $word;

    }

    // return random component from chosen letter's bin 
    return $bins[$letter][array_rand($bins[$letter])];

}

以下方法甚至适用于选择合格词的方法,这些方法比仅检查第一个字母更复杂,并且不依赖于数组中所有合格词的连续性

$candidatestested = 0;
foreach ($arr as $candidate) {
   if ($candidate[0] == 'b' && rand(0,$candidatestested++)==0) {
       $result = $candidate;
   }
}
if (!$candidatestested) {
   trigger_error("There was no word matching the criterion");
}
return $result;

以下方法甚至适用于选择合格词的方法,这些方法比仅检查第一个字母更复杂,并且不依赖于数组中所有合格词的连续性

$candidatestested = 0;
foreach ($arr as $candidate) {
   if ($candidate[0] == 'b' && rand(0,$candidatestested++)==0) {
       $result = $candidate;
   }
}
if (!$candidatestested) {
   trigger_error("There was no word matching the criterion");
}
return $result;

这应该行得通。在洗牌数组后,以“B”或任何字母开头的每个单词都有随机机会成为洗牌数组中的第一个。依靠PHP的shuffle可能比我们自己的实现更高效、更快

function returnWithFirstLetter($words, $letter) {
    shuffle($words);
    foreach($words as $word)
        if($word[0] == $letter)
            return $word;
}

这应该行得通。在洗牌数组后,以“B”或任何字母开头的每个单词都有随机机会成为洗牌数组中的第一个。依靠PHP的shuffle可能比我们自己的实现更高效、更快

function returnWithFirstLetter($words, $letter) {
    shuffle($words);
    foreach($words as $word)
        if($word[0] == $letter)
            return $word;
}

你可以使用in_数组函数。如果数组是硬编码的,那么你可以在数组中按字母组合单词,例如“b”=>数组“香蕉”、“船”。。。然后只需数组_rand$arr[$letter];你可以使用in_数组函数。如果数组是硬编码的,那么你可以在数组中按字母组合单词,例如“b”=>数组“香蕉”、“船”。。。然后只需数组_rand$arr[$letter];您可以直接使用$word[0]而不是调用substr。@Wiseguy更快、更脏,将进行编辑。我怎么能不相信另一个查理·布朗!说得好,恰克。如果你想要最快和最脏的,我可以用两行回答这个问题,可能一行,但在某个点上,它变得比快速更脏。有时可读性仍然很好-除了调用substr,您还可以直接使用$word[0]。@Wiseguy更快更脏,将进行编辑。我怎么能不相信另一个查理·布朗!说得好,恰克。如果你想要最快和最脏的,我可以用两行回答这个问题,可能一行,但在某个点上,它变得比快速更脏。有时可读性仍然很好-普尼斯!澄清一下,当您运行这个php函数时,会这样使用它吗?返回第一个字母$somearray,b?是;这就是使用它的方法很好!澄清一下,当您运行这个php函数时,会这样使用它吗?返回第一个字母$somearray,b?是;这就是使用它的方法