我有 2 個陣列。一個用于字母和所述字母的點。
我已經得到了用戶輸入的單詞并將其變成了一個陣列。
然后我回圈遍歷$letters陣列以找到單詞中每個字母的鍵。
接下來我回圈遍歷$points陣列以找到與字母位置對應的鍵值。我遇到的問題是,當我找到這些值時,我想將它們加在一起,但我做不到。 array_sum()給出一個錯誤,說它必須是一個陣列。
這是我的代碼:
<?php
$letters = ["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", "ER", "CL", "IN", "TH", "QU"];
$points= [2, 8, 8, 5, 2, 6, 6, 7, 2, 13, 8, 3, 5, 5, 2, 6, 15, 5, 3, 3, 4, 11, 10, 12, 4, 14, 7, 10, 7, 9, 9];
if(isset($_POST['play'])) {
//INDEX TO COUNT THROUGH 'letters' ARRAY
$spot = "";
$tally = 0;
//GET WORD FROM USER AND UPPERCASE IT
$ply1_word = strtoupper($_POST['player1']);
//TURN WORD STRING INTO ARRAY
$word_letters = str_split($ply1_word);
// echo "<pre>";
// print_r($word_letters);
// echo "</pre>";
for ($i = 0; $i < count($word_letters); $i ) {
if (in_array($word_letters[$i], $letters)) {
$spot = array_search($word_letters[$i], $letters);
}
if (isset($values[$spot])) {
// echo $values[$spot] . "<br>";
// print_r($values[$spot]);
// var_dump($values[$spot]);
// NEED TO ADD NUMBERS TOGETHER HERE OR AFTER HERE
}
}
}
uj5u.com熱心網友回復:
您的代碼中有一些問題:
- 您正在使用的
$valueswich 不存在,您應該將其替換為$points. - 即使角色不在您的
$letters(嘗試使用“測驗我”)中,您也會space添加積分,與T. - 您的代碼無法處理您的最后一個字母 (
"ER", "CL", "IN", "TH", "QU")
您可以在不使用array_sum, 的情況下執行此操作 =:
$tally = $points[$spot]
更進一步,您的代碼無法處理最后一個$letters,您也需要更改代碼以檢查這些字母。
作業代碼,有一些var_dump:
if(isset($_POST['play'])) {
$spot = "";
$tally = 0;
//GET WORD FROM USER AND UPPERCASE IT
$ply1_word = strtoupper($_POST['player1']);
var_dump($ply1_word);
//TURN WORD STRING INTO ARRAY
$word_letters = str_split($ply1_word);
print_r($word_letters);
$skipNextLetter = false; // needed to handle "ER", "CL", "IN", "TH", "QU"
for ($i = 0; $i < count($word_letters); $i ) {
// reset $spot to prevent adding points when char isn't in $letters
$spot = '';
// don't check this char if old one was a combination of two chars
if ($skipNextLetter) {
$skipNextLetter = false;
continue;
}
$char = $word_letters[$i];
$charTemp = $word_letters[$i];
// handle "ER", "CL", "IN", "TH", "QU"
if (isset($word_letters[$i 1])) {
$charTemp .= $word_letters[$i 1];
var_dump('===> check with next char :: ' . $charTemp);
if (in_array($charTemp, ['ER', 'CL', 'IN', 'TH', 'QU'])) {
$char = $charTemp;
$skipNextLetter = true;
}
}
if (in_array($char, $letters)) {
$spot = array_search($char, $letters);
}
var_dump('CHAR => ' . $char . ' / SPOT => ' . $spot);
if (isset($points[$spot])) {
echo $points[$spot] . "<br>";
// print_r($points[$spot]);
var_dump('ADDING POINTS : ' . $points[$spot]);
// NEED TO ADD NUMBERS TOGETHER HERE OR AFTER HERE
$tally = $points[$spot];
}
}
結果 :
$test = 'Stackoverflow';
// $tally = 65
$test = 'Stackoverflow Clean';
// $tally = 84
正如弗里茨所說,我會以不同的方式做事(即用array_values)
uj5u.com熱心網友回復:
您的代碼(原樣)幾乎可以正常作業。
您只需要添加幾個修復程式。
上面寫著:
if (isset($values[$spot])) {
您沒有在任何地方宣告 $values 變數,所以我假設您的意思是:
if (isset($points[$spot])) {
最后,要總計實際點值,您可以使用以下內容(在修復上述行之后):
if (isset($points[$spot])) {
$tally = $points[$spot];
}
總而言之:
<?php
$letters = ["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", "ER", "CL", "IN", "TH", "QU"];
$points= [2, 8, 8, 5, 2, 6, 6, 7, 2, 13, 8, 3, 5, 5, 2, 6, 15, 5, 3, 3, 4, 11, 10, 12, 4, 14, 7, 10, 7, 9, 9];
if(isset($_POST['play'])) {
//INDEX TO COUNT THROUGH 'letters' ARRAY
$spot = "";
$tally = 0;
//GET WORD FROM USER AND UPPERCASE IT
$ply1_word = strtoupper($_POST['player1']);
//TURN WORD STRING INTO ARRAY
$word_letters = str_split($ply1_word);
// echo "<pre>";
// print_r($word_letters);
// echo "</pre>";
for ($i = 0; $i < count($word_letters); $i ) {
if (in_array($word_letters[$i], $letters)) {
$spot = array_search($word_letters[$i], $letters);
}
if (isset($points[$spot])) {
// echo $values[$spot] . "<br>";
// print_r($values[$spot]);
// var_dump($values[$spot]);
// NEED TO ADD NUMBERS TOGETHER HERE OR AFTER HERE
$tally = $points[$spot];
}
}
// Maybe print the Word and tally here?
echo $ply1_word . " has score of " . $tally . "<br>";
}
話雖如此,我會做完全不同的事情。
對于初學者,我會使用一個關聯陣列,其中字符是鍵,點是值。
不過,只要您修復了上述錯誤,您的解決方案就可以使用。
問候,弗里茨。
uj5u.com熱心網友回復:
@micster 提出的觀點非常正確。只是為了讓您了解如何以完全不同的方式解決此問題(使用array_reduce):
<?php
$scores = [
"A" => 2, "B" => 8, "C" => 8, "D" => 5, "E" => 2,
"F" => 6, "G" => 6, "H" => 7, "I" => 2, "J" => 13,
"K" => 8, "L" => 3, "M" => 5, "N" => 5, "O" => 2,
"P" => 6, "Q" => 15, "R" => 5, "S" => 3, "T" => 3,
"U" => 4, "V" => 11, "W" => 10, "X" => 12, "Y" => 4,
"Z" => 14, "ER" => 7, "CL" => 10, "IN" => 7, "TH" => 9,
"QU" => 9,
];
$word = 'thesaurus';
$wordScore = array_reduce(str_split($word, 2), function($carriedScore, $charPair) use ($scores) {
$charPair = strtoupper($charPair);
if(isset($scores[$charPair])) {
$score = $scores[$charPair];
} else {
$score = $scores[$charPair[0]] ?? 0;
$score = $scores[$charPair[1]] ?? 0;
}
return $carriedScore $score;
}, 0);
var_dump($wordScore); // 32
這段代碼背后的總體思路是,我們首先將輸入的單詞拆分為兩個字符的組合。因此,按照示例,我們正在創建一個陣列:[ th, es, au, ru, s ]. 然后,對于每個專案,我們正在檢查該組合是否存在于我們的$scores陣列中。如果沒有,我們只是將各個字符的分陣列合起來。
這段代碼還存在一個缺陷。如果您的單詞是第十個([ te, nt, h ]),它將被評分為t e n t h和不是t e n th。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/419414.html
標籤:
