Fatal error в цикле, задача fizz buzz

158
06 февраля 2018, 09:57

$handle = file("E:\OpenServer\OSPanel\domains\php6\source.txt"); //фай содержит 3 значения, к примеру 3, 6, 120
$handleInt = array_map("integer", $handle); //приведение к int
$arrResult = range(1, $handleInt[2]);
function integer ($a){
    return (integer)$a;
} //костыль для приведения элементов $handle к int
function fizzBuzz ($a, $b){
    if (!($a % $b[0]) && !($a % $b[1])){//fatal error здесь
       return "FB ";
    } elseif (!($a % $b[0])) {
        return "F ";
    } elseif(!($a % $b[1])){
        return "B";
    } else return $a;
}
print_r($arrResult);
array_map("fizzBuzz", $arrResult, $handleInt);
?> </code>

Задача fizz-buzz:

Есть три числа которые программы принимает из файла. Первое число называется fizz, второе называется buzz. До третьего необходимо досчитать от единицы. Считая, надо выводить число. Если число кратно fizz - надо выводить F вместо числа. Если число кратно buzz - надо выводить B вместо числа. Если число кратно и fizz и buzz, надо выводить FB. И так - пока не будет достигнуто третье введенное число.

Пример условия и результата: Введены числа 2, 5, 18 Вывод должен быть таким: 1 F 3 F B F 7 F 9 FB 11 F 13 F B F 17 F

Вывод в консоли:

C:\Users\Максим>php E:\OpenServer\OSPanel\domains\php6\index.php Array ( [0] => 1 [1] => 2 )

Fatal error: Uncaught DivisionByZeroError: Modulo by zero in E:\OpenServer\OSPanel\domains\php6\index.php:12

Stack trace:

#0 [internal function]: fizzBuzz(1, 1)

#1 E:\OpenServer\OSPanel\domains\php6\index.php(22): array_map('fizzBuzz', Array, Array)

#2 {main} thrown in E:\OpenServer\OSPanel\domains\php6\index.php on line 12

Answer 1

В общем там не одна ошибка

Первое array_map("fizzBuzz", $arrResult, $new_handle); Массивы должны быть одинаковый длины поэтому не второй элемент, который равен 120, а $arrResult = range(1, count($new_handle));

Второе как и говорил не понятно, как приводиться к массиву

// $handleInt = array_map("integer", $handle); //приведение к int
// Warning: array_map(): Argument 
// 2 should be an array in /var/www/test.php/ind.php on line 4

Выдавало ошибку, как и говорил дожен быть массив поэтому

http://php.net/manual/ru/function.array-map.php

К примерe я прочитал текст он равен $handle = "3,6,120";, делаем explode, $new_handle = explode(",", $handle);

http://php.net/manual/ru/function.explode.php

Тертья у тебя идет не понятно в самой функции, $b[0] или $b[1], он делает перебор массивов и берет по значению, получается это integer, а не массив

Четвертое не уверен, но я не понял для чего $a % $b, это остаток от деления, следовательно выдает число, а любое число >= 1 это true, соответсвенно всегда правиьно, оно должно равняться нулю $a % $b == 0, тогда ты проверяешь делиться это число или нет.

Итог ты сравнивывываешь не каждое число, поэтому могу только догадываться чего точно ты хотел сделать, но для этого тебе нужно делать цикл

for($i = 0; $i < count($new_handle) - 1 ; $i++) {
    echo fizzBuzz($arrResult, $new_handle, $i);
}

А третий параметр это индекс по массиву, а в функцию передаешь массивы

Окончательный результат

$handle = "3,6,120";
$new_handle = explode(",", $handle);
$arrResult = range(1, count($new_handle));
function fizzBuzz ($a, $b){
    if (! ($a % $b == 0) && !($a % $b == 0)){//fatal error здесь
       return "FB "; 
    } elseif (!($a % $b == 0)) {
        return "F "; 
    } elseif(! ($a % $b == 0) ) {
        return "B"; 
    } else return $a;
}

$t[] = array_map("fizzBuzz", $arrResult, $new_handle);
print_r($t);
Answer 2

Решение затаилось неглубоко, при передаче в array_map второго массива, $handleInt. Вместо этого я объявил массив глобально в функции fizzBuzz.

Вот что получилось)

    $handle = file("E:\OpenServer\OSPanel\domains\php6\source.txt");
    $handleInt = array_map("integer",$handle);
    $arrResult = range(1, $handleInt[2]);
    function integer ($a){
        return (integer)$a;
    }
    function fizzBuzz ($a){
        global $handleInt;
        if (!($a % $handleInt[0]) && !($a % $handleInt[1])){
           return "FB ";
        } elseif (!($a % $handleInt[0])) {
            return "F ";
        } elseif(!($a % $handleInt[1])){
            return "B";
        } else return $a;
    }
    print_r (array_map("fizzBuzz",$arrResult));
    ?>
READ ALSO
Проблема с функцией обобщенного класса

Проблема с функцией обобщенного класса

В книге Шилдта наткнулся на такой пример :

198
Цикл не выдает правильный результат

Цикл не выдает правильный результат

Всех приветствую, вот код

245
Как скопилировать с помощью MinGW?

Как скопилировать с помощью MinGW?

Компилирую программу с помощью MinGW таким образом:

214