Учебные задачи - PHP. Задача №14

Задача из списка
Есть два массива "a" и "b". На вход вашей программе подаётся массив "a" случайных
чисел (10 элементов) из диапазона от 1 до 20. Задача: вывести на экран все числа,
которые не содержатся в массиве "b":

$b = [12, 5, 17, 6, 4];

Решите эту задачу двумя способами:
Без использования in_array();
С использованием in_array().

1) без использования in_array:

<?php
$b = [12, 5, 17, 6, 4];

function createArray() {
    for ($i = 1; $i <=10; $i++) {
        $a[] = rand(1, 20);
    }
    return $a;
}

function diffValue($a, $b) {
    foreach ($a as $m => $mas) {
        foreach ($b as $n => $val) {
            if ($mas == $val) {
                unset ($a[$m]);
            }
        }
    }
    foreach($a as $value) {
        echo $value, "<br>";
        }
    }

diffValue(createArray(), $b);

2) c использованием in_array:

<?php
$b = [12, 5, 17, 6, 4];

function createArray() {
    for ($i = 1; $i <=10; $i++) {
        $a[] = rand(1, 20);
    }
    return $a;
}

function diffValue($a, $b) {
	foreach ($a as $mas) {
		if (! in_array("$mas", $b)) {
			echo $mas, "<br>";
		}
	}
}

diffValue(createArray(), $b);
vedro-compota's picture

function diffValue($a, $b) {
    foreach ($a as $m => $mas) {
        foreach ($b as $n => $val) {
            if ($mas == $val) {
                unset ($a[$m]);
            }
        }
    }
    foreach($a as $value) {
        echo $value, "<br>";
        }
    }

приведите вариант решения без unset()

_____________
матфак вгу и остальная классика =)

<?php
$b = [12, 5, 17, 6, 4];
 
function createArray() {
    for ($i = 1; $i <=10; $i++) {
        $a[] = rand(1, 20);
    }
	foreach ($a as $i){
		echo $i, "a<br>";
	}
    return $a;
}

function diffValue($a, $b) {
	$counter = 0;
    foreach ($a as $m => $mas) {
        foreach ($b as $n => $val) {
            if ($mas != $val) {
				$counter++;
				if ($counter == count($b)){
					echo $mas, "<br>";
					$counter = 0;
				}
			} elseif ($mas == $val) {
				$counter = 0;
				break;
			}
		}
    }
}

diffValue(createArray(), $b);
vedro-compota's picture

  • не сильно внятны имена переменных:
      $m $mas и  $n

    исправьте

  • в условном операторе есть некоторая избыточность: if ($mas != $val) {
                   
     if ($counter == count($b)){
                   // .......
       } elseif ($mas == $val) {

    -- в чем она состоит? исправьте (тут есть код, который не влияет на последовательность действий в данном случае)

  • _____________
    матфак вгу и остальная классика =)

    <?php
    $b = [12, 5, 17, 6, 4];
      
    function createArray() {
        for ($i = 1; $i <=10; $i++) {
            $a[] = rand(1, 20);
        }
        return $a;
    }
     
    function diffValue($a, $b) {
        $counter = 0;
    	foreach ($a as $valFromA) {    /*дал новые имена переменным*/
            foreach ($b as $valFromB) {
                if ($valFromA != $valFromB) {
                    $counter++;
                    if ($counter == count($b)){
                        echo $valFromA, "<br>";
                        $counter = 0;
                    }
    			} else { /*убрал оператор elseif*/
                    $counter = 0;
                    break;
                }
            }
        }
    }
     
    diffValue(createArray(), $b);
    vedro-compota's picture

    уже лучше, но можно сделать, так чтобы проверка:

     if ($counter == count($b)){
                        echo $valFromA, "<br>";
                        $counter = 0;
                    }
    

    выполнялась только 1 раз за виток внешнего цикла (и, соответственно, действия по ней), а не на каждое неравенство. Попробуйте.

    _____________
    матфак вгу и остальная классика =)

    <?php
    $b = [12, 5, 17, 6, 4];
       
    function createArray() {
        for ($i = 1; $i <=10; $i++) {
            $a[] = rand(1, 20);
        }
        return $a;
    }
      
    function diffValue($a, $b) {
        foreach ($a as $valFromA) {
    		$counter = True;
            foreach ($b as $valFromB) {
                if ($valFromA == $valFromB) {
                    $counter = False;
                    break;
                }
            }
    		if ($counter) {
    			echo $valFromA, "<br>";
    		}
        }
    }
      
    diffValue(createArray(), $b);
    vedro-compota's picture

    решение засчитано

    _____________
    матфак вгу и остальная классика =)