Учебные задачи PHP. Задача 6

Дано некоторое число длиной от 1 до 5 символов, вывести все его "нечётные" цифры в обратном порядке (аналогично предыдущей задаче), если же таких цифр не найдёт, вывести сообщение "Нечетных цифр не обнаружено!"

Решение задачи с четными цифрами:

<?php
function outputNumberInReverseOrder($number)
{
    echo $number, " = <br>";
	$arr = array();
    while ($number >= 1) {		
        $remainderOfDivision =  $number % 10;
		if ($remainderOfDivision % 2 == 1) {
			$arr[] = $remainderOfDivision;
		}
		if ($remainderOfDivision % 2 == 1) {
			echo $remainderOfDivision, "<br>";
		}
        $numberDividedBy10 = $number / 10;        
        $number = $numberDividedBy10;
        }
	if ($arr === []) {
		echo "Нечетных цифр не обнаружено! <br>";
	}
}
outputNumberInReverseOrder(2468);
?>

Решение задачи с нечетными цифрами:

<?php
function outputNumberInReverseOrder($number)
{
    echo $number, " = <br>";
	$arr = array();
    while ($number >= 1) {		
        $remainderOfDivision =  $number % 10;
		if ($remainderOfDivision % 2 == 1) {
			$arr[] = $remainderOfDivision;
		}
		if ($remainderOfDivision % 2 == 1) {
			echo $remainderOfDivision, "<br>";
		}
        $numberDividedBy10 = $number / 10;        
        $number = $numberDividedBy10;
        }
	if ($arr === []) {
		echo "Нечетных цифр не обнаружено! <br>";
	}
}
outputNumberInReverseOrder(1357);
?>

Key Words for FKN + antitotal forum (CS VSU):

melisa's picture

  1. Решение задачи с четными цифрами

    Не поняла смысла. Вроде оба варианта решения одинаковы)

  2. $numberDividedBy10

    Некорректное имя переменной. Оно не должно содержать цифр.

  3.         if ($remainderOfDivision % 2 == 1) {
                $arr[] = $remainderOfDivision;
            }
            if ($remainderOfDivision % 2 == 1) {
                echo $remainderOfDivision, "<br>";
            }

    Не нужно запрашивать условие для каждой операции, можно написать в теле одного if оба действия

  4. $arr = array();

    В современный версиях php используется укороченная запись:

    $arr = [];
  5. if ($arr === [])

    Вместо оператора сравнения воспользуйтесь встроенной функцией php, empty()

Вместо оператора сравнения воспользуйтесь встроенной функцией php, empty()

Да, спасибо. На просторах инета видел этот вариант. Но один товарищ сказал:

if($array === []){ ... }

Более оптимальный так как:
- Код более читаемый - "Если переменная равна пустому массиву";
- Сразу идет контроль типов, и вы действительно сравниваете массив;
- Не используются функции, а только сравнение, значит этот код будет работать немного быстрее;

Что тоже мне показалось интересным.

melisa's picture

Целесообразность разных способов, конечно, нужно рассматривать в каждом конкретном случае. В данном я предложила использовать функцию с целью ознакомления с альтернативным вариантом.

Несколько расширил условия задачи с дополнительными выводами.

<?php
function outNumbInRevOrd($number)
{
    $remOfDivArrOdd = [];
    $remOfDivArrEven = [];
     
    while ($number >= 1) {      
        $remOfDiv = $number % 10;      
        if ($remOfDiv % 2 == 1) {
            $remOfDivArrOdd[] = $remOfDiv;  // массив НЕчетных цифр
        } else {
            $remOfDivArrEven[] = $remOfDiv; // массив ЧЕтных цифр
        }
        $number = $number / 10;   // в/о остаток от деления нужно вычесть из числа?
    }
 
    if ((!($remOfDivArrOdd == [])) && (!($remOfDivArrEven == []))) { 
        echo "НЕчетные и ЧЕтные присутствуют! <p>"; 
        return $remOfDivArrOdd;
    }
     
    if (!($remOfDivArrOdd == [])) { // если массив не пуст
        echo "Четных цифр не обнаружено! <p>"; 
        return $remOfDivArrOdd;       
    }
     
    if (!($remOfDivArrEven == [])) {    // если массив не пуст
        echo "Нечетных цифр не обнаружено! <p>"; 
        return $remOfDivArrOdd;
    }       
}
$number = 234;                  
$output = outNumbInRevOrd($number); 
echo "$number = <br>";               
foreach ($output as $value) {   
    echo $value. '<br>';
}
?>
melisa's picture

  1. if ((!($remOfDivArrOdd == [])) && (!($remOfDivArrEven == []))) { 
            echo "НЕчетные и ЧЕтные присутствуют! <p>"; 
            return $remOfDivArrOdd;
        }
          
        if (!($remOfDivArrOdd == [])) { // если массив не пуст
            echo "Четных цифр не обнаружено! <p>"; 
            return $remOfDivArrOdd;       
        }
          
        if (!($remOfDivArrEven == [])) {    // если массив не пуст
            echo "Нечетных цифр не обнаружено! <p>"; 
            return $remOfDivArrOdd;
        }       

    Всю эту конструкцию можно написать короче с помощью оператора elseif

  2. return $remOfDivArrOdd;

    Неверно эту строку писать внутри условий, т.к. условия никак на неё не влияют. и от них она не зависит. тем более трижды.

  3. !($remOfDivArrEven == [])

    Для отрицания равенства существуют свои операторы сравнения.

Всю эту конструкцию можно написать короче с помощью оператора elseif

Для отрицания равенства существуют свои операторы сравнения

Спасибо. Переделал.

Насчет этого момента:

Неверно эту строку писать внутри условий, т.к. условия никак на неё не влияют. и от них она не зависит. тем более трижды.

Я, возможно, где-то здесь недопонимаю, но, в тестовом режиме, я подставлял поочередно два массива (для четных и нечетных цифр) и видел, как это условие:

return $remOfDivArrOdd;

или

return $remOfDivArrEven;

влияло на результат, т.е. выводило либо четные, либо нечетные цифры.
Другой момент, когда я ставил подряд два эти условия:

if (($remOfDivArrOdd != []) && ($remOfDivArrEven != [])) { 
        echo "НЕчетные и ЧЕтные присутствуют! <p>"; 
		return $remOfDivArrOdd;
		return $remOfDivArrEven;

то выполнялось только первое условие по ходу движения.

Строка 25. Я поставил

return $remOfDivArrEven;

что против условия задачи (выводить в обр порядке НЕчетные цифры), код стал выводить ЧЕтные цифры в обр порядке, как в этом примере:

<?php
function outNumbInRevOrd($number)
{
    $remOfDivArrOdd = [];
    $remOfDivArrEven = [];
      
    while ($number >= 1) {      
        $remOfDiv = $number % 10;      
        if ($remOfDiv % 2 == 1) {
            $remOfDivArrOdd[] = $remOfDiv;  // массив НЕчетных цифр
        } else {
            $remOfDivArrEven[] = $remOfDiv; // массив ЧЕтных цифр
        }
        $number = $number / 10;   
    }

    if (($remOfDivArrOdd != []) && ($remOfDivArrEven != [])) { 
        echo "НЕчетные и ЧЕтные цифры присутствуют! <p>"; 
		return $remOfDivArrOdd;
    } elseif ($remOfDivArrOdd != []) { 
        echo "Четных цифр не обнаружено! <p>"; 
        return $remOfDivArrOdd;       
	} elseif ($remOfDivArrEven != []) {    
        echo "Нечетных цифр не обнаружено! <p>"; 
        return $remOfDivArrEven;
    }       
}
$number = 246;                  
$output = outNumbInRevOrd($number); 
echo "$number = <br>";               
foreach ($output as $value) {   
    echo $value. '<br>';
}
?>