2 回答

TA貢獻1111條經(jīng)驗 獲得超0個贊
function countOccurrence($number, $digit){
? ? $result = 0;
? ? while ($number > 0){
? ? ? ? $lastDigit = $number % 10;
? ? ? ? if($lastDigit === $digit){ // <-- bug is here
? ? ? ? ? ? $result++;
? ? ? ? }
? ? ? ? $number = ($number - $lastDigit)/10;
? ? }
? ? return $result;
}
由于您正在進行嚴格比較,因此這些值永遠不會相等。原因如下:
當您從 $_POST 獲取數(shù)據(jù)時,它始終是一個字符串。所以你調(diào)用countOccurrence(1111, '1')
它將返回 0 :)
正如我在評論中提到的,您可以用以下函數(shù)替換您的函數(shù):
substr_count
代替countOccurrence
range
代替makeArray
如果您想堅持自己的職能。將輸入轉換為 int,然后使用intval將其傳遞給函數(shù)。

TA貢獻1860條經(jīng)驗 獲得超9個贊
這就是你的小怪物所在的地方……
if($lastDigit === $digit){
您在這里期望的是按值和按類型進行比較(===)。
您可以使用 gettype() 來驗證這一點;
while ($number > 0) {
$lastDigit = $number % 10;
echo '$lastDigit is a '.gettype($lastDigit);
echo ' $digit is a '.gettype($digit);
echo '<br>';
if ($lastDigit === $digit) {
$result++;
}
$number = ($number - $lastDigit) / 10;
}
來自 POST 的值始終是 String 類型。因為 $digit 是一個字符串,$lastDigit 是一個數(shù)字(整數(shù))。使用 === 將失敗,因為它們不是同一類型。
因此,由于 PHP 具有自行類型轉換的能力...將 === 更改為 == 就可以了。IE
if ($lastDigit == $digit) {
PHP 將嘗試將 RHS 值轉換為 LHS 類型,然后執(zhí)行比較。
所以現(xiàn)在您只是執(zhí)行比較,PHP 正在將 $digit 轉換為整數(shù)。
更安全的方法是強制鑄造。因此,您可以將 $digit 從字符串轉換為整數(shù),并使用現(xiàn)有的代碼。
function countOccurrence($number, $digit) {
$result = 0;
$digit = intval($digit); // Force $digit to be an integer
while ($number > 0) {
$lastDigit = $number % 10;
echo '$lastDigit is a '.gettype($lastDigit);
echo ' $digit is a '.gettype($digit);
echo '<br>';
if ($lastDigit === $digit) {
$result++;
}
$number = ($number - $lastDigit) / 10;
echo ' $number is a '.gettype($number);
}
return $result;
}
因此,從中吸取的教訓是,當使用 === 時,請確保您的類型也相同。
- 2 回答
- 0 關注
- 130 瀏覽
添加回答
舉報