Php 根据字母值查找字符串中得分最高的单词?

Php 根据字母值查找字符串中得分最高的单词?,php,Php,给定一串单词,我需要找到得分最高的单词。单词的每个字母根据其在字母表中的位置得分:a=1、b=2、c=3等等。我需要将得分最高的单词作为字符串返回 因此在字符串“man我需要一辆出租车到达乌布”中,正确的返回字符串应该是taxi,因为它有像t和x这样的高值字母 我的困惑在于如何给每个单词中的每个字母赋值。我知道要分解输入字符串,然后foreach在上面分解单词,但是如何根据字母表中的顺序增加值呢?我很困惑 function high($x) { $alphabet = ["a&

给定一串单词,我需要找到得分最高的单词。单词的每个字母根据其在字母表中的位置得分:a=1、b=2、c=3等等。我需要将得分最高的单词作为字符串返回

因此在字符串
“man我需要一辆出租车到达乌布”
中,正确的返回字符串应该是taxi,因为它有像t和x这样的高值字母

我的困惑在于如何给每个单词中的每个字母赋值。我知道要分解输入字符串,然后foreach在上面分解单词,但是如何根据字母表中的顺序增加值呢?我很困惑

function high($x) {
    $alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
                "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
                "u", "v", "w", "x", "y", "z"];
    $nA = array_flip($alphabet);

    $words = explode(" ", $x);
    foreach($words as $w) {
      explode("", $w);
    }
    return "";
}

正如您所说,您需要迭代每个单词,并为每个单词确定其分数。然后你需要记下这个词的分数,还有这个词本身,或者这个词的位置。如果您计算的下一个分数比您保存的分数高,则覆盖-否则,继续下一次迭代。最后,返回值

使用
strtolower()
确保单词是小写的,否则像
带X光片的人这样的字符串将不会将
X光片
作为得分最高的单词

功能高($input){
//初始化:将字符串转换为小写,并生成字母表数组
$input=strtolower($input);
$alphabet=范围('a','z');
$values=数组翻转($alphabet);
//将单词拆分为一个数组,并声明初始分数
$words=explode(“,$input”);
$highestScore=null;
$highestIndex=null;
//逐字逐句
foreach($k=>w){
//计算当前单词的分数
//分数是翻转字母表数组的位置,如果不在lsit中,则为0
$score=数组和(数组映射(函数($v)使用($value){
返回$values[$v]??0;
},str_split($w));
//如果当前分数高于上一个最高分数,则覆盖它
如果($highestScore<$score){
$highestScore=$score;
$highestIndex=$k;
}
}
//返回得分最高的索引处的单词
//如果没有分数(如果$input为空),则返回默认消息
返回$words[$highestIndex]??“不适用-未找到单词”;
}
array\u map()
函数将返回该单词(每个字母)的所有单个值的数组,因此我们使用
array\u sum()
来获取数组的完整和

因为我们使用
返回$value[$v]??0;
并且仅从
a-z
创建值,任何其他字符的得分都为0。当字符串转换为小写时,这意味着它将以相同的分数1处理
a
a
。特殊字符,如
#等将得到0分

  • 现场演示

正如您所说,您需要迭代每个单词,并为每个单词确定分数。然后你需要记下这个词的分数,还有这个词本身,或者这个词的位置。如果您计算的下一个分数比您保存的分数高,则覆盖-否则,继续下一次迭代。最后,返回值

使用
strtolower()
确保单词是小写的,否则像
带X光片的人这样的字符串将不会将
X光片
作为得分最高的单词

功能高($input){
//初始化:将字符串转换为小写,并生成字母表数组
$input=strtolower($input);
$alphabet=范围('a','z');
$values=数组翻转($alphabet);
//将单词拆分为一个数组,并声明初始分数
$words=explode(“,$input”);
$highestScore=null;
$highestIndex=null;
//逐字逐句
foreach($k=>w){
//计算当前单词的分数
//分数是翻转字母表数组的位置,如果不在lsit中,则为0
$score=数组和(数组映射(函数($v)使用($value){
返回$values[$v]??0;
},str_split($w));
//如果当前分数高于上一个最高分数,则覆盖它
如果($highestScore<$score){
$highestScore=$score;
$highestIndex=$k;
}
}
//返回得分最高的索引处的单词
//如果没有分数(如果$input为空),则返回默认消息
返回$words[$highestIndex]??“不适用-未找到单词”;
}
array\u map()
函数将返回该单词(每个字母)的所有单个值的数组,因此我们使用
array\u sum()
来获取数组的完整和

因为我们使用
返回$value[$v]??0;
并且仅从
a-z
创建值,任何其他字符的得分都为0。当字符串转换为小写时,这意味着它将以相同的分数1处理
a
a
。特殊字符,如
#等将得到0分

  • 现场演示

由于您实际上并不关心分数,因此可以使用具有最高字符的单词来计算ascii值。这个字母表是按升序排列的,因此给出了一个更高的值——但它仍然基于位置

这将拆分单词,然后为每个单词添加ascii值,并跟踪最高

function high($x) {
    // Split sentence into words (lower cased)
    $words = explode(" ", strtolower($x));
    $max = 0;
    $maxWord = '';
    foreach($words as $w) {
        // Keep track of 'value' of word
        $value = 0;
        // For each letter of the word ($i)...
        for ( $i = 0, $len = strlen($w); $i < $len; $i++ )  {
            // $w[$i]  is the letter we are dealing with (treat a string as an array)
            // Take the ascii value of this character and adjust it by 'a'
            $value += (ord($w[$i]) -ord('a'));
        }
        // Check if the new highest value
        if ( $value > $max )    {
            $max = $value;
            $maxWord = $w;
        }
    }
    return $maxWord;
}
功能高($x){
//将句子拆分为单词(小写)
$words=explode(“,strtolower($x));
$max=0;
$maxWord='';
foreach($w){
//跟踪单词的“价值”
$value=0;
//对于单词的每个字母($i)。。。
对于($i=0,$len=strlen($w);$i<$len;$i++){
//$w[$i]