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

Есть два массива "a" и "b". На вход вашей программе подаётся массив "a" случайных чисел (10 элементов) из диапазона от 1 до 20. Задача: вывести на экран все числа, которые не содержатся в массиве "b":
$b = [12, 5, 17, 6, 4];
Решите эту задачу двумя способами:
Без использования in_array()
С использованием in_array() (что проще)

function generationArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [5..12]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
$a = generationArray(10); // из этого массива $a исключаем все элементы, которые
$b = [12, 5, 17, 6, 4];		// содержаться в этом массиве $b

$result = array_diff($a, $b);	// Возвращает array, содержащий элементы array1, отсутствующие в любом из всех остальных массивах.
print_r($result);	// для наглядности проверки кода

foreach ($result as $v) {	// обходим массив, выводя его элементы
	echo $v. ' ';
}
melisa's picture

хорошо, но решите эту задачу без использования также и array_diff((), просто работая с массивами

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [5..12]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}

function compareArr($a, $b)
{
	foreach ($a as $i) {
		foreach ($b as $j) {
			if ($i == $j) {
				$res = null;
				break;
			} else {
				$res = $i;
			}
		}
		$result[] = $res;
	}
	return $result;
}

$a = generateArray(10); // из этого массива $a исключаем все элементы, которые
$b = [12, 5, 17, 6, 4];     // содержаться в этом массиве $b
$result = compareArr($a, $b);
print_r($result);	// для наглядности проверки кода

foreach ($result as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>

Выше код выполняет условие задачи, но с оговоркой. Если значения выводить через запятую, то будут лишние запятые.
Ниже код лишен этого недостатка:

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [1..20]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
 
function compareArr($a, $b)
{
	$x = 0; // техническая переменная
    foreach ($a as $i) {
        foreach ($b as $j) {
            if ($i == $j) {
                $x = $j;	// присваиваем любое значение переменной $x
                break;
            } 
        }
        if ($x != 0) {	// если переменная содержит значение отличное от "0", то
			$x = 0;		// $x = 0 и переходим к следующей итерации
		} else {
			$result[] = $i;	// если в текущей итерации совпадений элементов в массивах нет, то заводим очередной элемент массива $a в массив $result для последующего вывода
    	}
    
	}
	return $result;
}
 
$a = generateArray(10); // из этого массива $a исключаем все элементы, которые
$b = [12, 5, 17, 6, 4];     // содержаться в этом массиве $b
$result = compareArr($a, $b);
print_r($result);   // для наглядности проверки кода
 
foreach ($result as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>
melisa's picture

if ($x != 0) {  // если переменная содержит значение отличное от "0", то
    $x = 0;     // $x = 0 и переходим к следующей итерации

а если в массиве $b 0 будет одним из значений?
лучше сделайте $x типом boolean

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [1..20]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
  
function compareArr($a, $b)
{
    $x = 0; // техническая переменная
    foreach ($a as $i) {
        foreach ($b as $j) {
            if ($i == $j) {
                $x = true;    
                break;
            } 
        }
        if ($x == true) {  
            $x = false;     
        } else {
            $result[] = $i; // если в текущей итерации совпадений элементов в массивах нет, то заводим очередной элемент массива $a в массив $result для последующего вывода
        }
     
    }
    return $result;
}
  
$a = generateArray(10); // из этого массива $a исключаем все элементы, которые
$b = [12, 5, 17, 6, 4];     // содержаться в этом массиве $b
$result = compareArr($a, $b);
print_r($result);   // для наглядности проверки кода
  
foreach ($result as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>
vedro-compota's picture

 if ($i == $j) {
                $x = true;    
                break;
            } 
        }
        if ($x == true) {  
            $x = false; 

Прокомментируйте смысл этих конструкций.

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

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [1..20]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
   
function compareArr($a, $b)
{
    $x = 0; // техническая переменная
    // обходим два массива и сравниваем каждый элемент двух массивов на предмет равенства, чтобы исключить совпадающий элемент второго массива
    foreach ($a as $i) {
        foreach ($b as $j) {
            if ($i == $j) {   // если условие выполняется, то
                $x = true;    // переменной присваиваем значение "true"
                break;
            } 
        }
        if ($x == true) {  // если $x == true, то пропускаем текущий элемент массива $b, т.к. по условию он должен быть исключен
            $x = false;    // присваиваем $x значение false, иначе при последующей итерации при $i != $j  (стр. 18) элемент массива будет пропущен и все необходимые элементы массива будут выведены
        } else {
            $result[] = $i; // если в текущей итерации совпадений элементов в массивах нет, то заводим очередной элемент массива $a в массив $result для последующего вывода
        }
      
    }
    return $result;
}
   
$a = generateArray(10); // из этого массива $a исключаем все элементы, которые
$b = [12, 5, 17, 6, 4];     // содержаться в этом массиве $b
$result = compareArr($a, $b);
print_r($result);   // для наглядности проверки кода
   
foreach ($result as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>
melisa's picture

Старайтесь давать комментарии так, как будто Вы ничего не знаете о задаче.

  1.  $x = 0; // техническая переменная

    Это бесполезный комментарий, т.к. совершенно не раскрывает смысл того, что же лежит в переменной.
    Комментарий должен быть типа

    // техническая переменная, которая служит для ...

    Наконец, назовите саму переменную $isInArray (переменные с типом boolean принято называть, начиная с is. Это придаёт названию переменной вопросительную форму: "Есть ли в массиве?") Это уже немного прояснит её назначение.

  2. if ($i == $j) {   // если условие выполняется, то
        $x = true;    // переменной присваиваем значение "true"

    Комментарии из разряда "капитан очевидность". Это тоже не нужно. Мы и так видим то, что написано в коде.
    А вот комментарий должен разъяснять, что за условие:

    // если очередные элементы созданного массива и массива $b равны

Ещё раз подчеркну важность смыслового именования переменных. Если бы Ваши $a и $b назывались $firstArray и $secondArray, $i и $j - $firstArraysElement и $secondArraysElement, а $x - $isInArray, возможно комментировать код бы не пришлось. В Вашем случае же постоянно приходится держать в голове содержание 5ти переменных или постоянно заново возвращаться к началу кода, чтобы вспомнить, что же в них лежит... Это, мягко говоря, неудобно. Поверьте, когда Вам понадобиться прочесть даже свой же код даже парумесячной давности, Вы уже меня поймёте :)

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [1..20]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
     
function compareArr($firstArray, $secondArray)
{
    $flagIndicatingValueElementsArrayB = null; // переменная-индикатор, предназначенная для присвоения значения true/false
    // обходим два массива и сравниваем каждый элемент двух массивов на предмет равенства, чтобы исключить совпадающий элемент второго массива
    foreach ($firstArray as $firstArraysElement) {
        foreach ($secondArray as $secondArraysElement) {
            if ($firstArraysElement == $secondArraysElement) {   // если очередные элементы массивов $firstArray и $secondArray равны, то
                $flagIndicatingValueElementsArrayB = true;    
                break;
            } 
        }
        if ($flagIndicatingValueElementsArrayB == true) {  // если условия = true, то пропускаем текущий элемент массива $b, т.к. по условию он должен быть исключен
            $flagIndicatingValueElementsArrayB = false;    // присваиваем $flagIndicatingValueElementsArrayB значение false, иначе при последующей итерации при $firstArraysElement != $secondArraysElement  (стр. 18) элемент массива будет пропущен и все необходимые элементы массива НЕ будут выведены
        } else {
            $resultArray[] = $firstArraysElement; // если в текущей итерации совпадений элементов в массивах $firstArray и $secondArray нет, то заводим очередной элемент массива $firstArray в массив $resultArray для последующего вывода
        }
        
    }
    return $resultArray;
}
     
$firstArray = generateArray(10); // из этого массива $firstArray исключаем все элементы, которые
$secondArray = [12, 5, 17, 6, 4];     // содержаться в этом массиве $secondArray
$resultArray = compareArr($firstArray, $secondArray);
print_r($resultArray);   // для наглядности проверки кода
     
foreach ($resultArray as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>
melisa's picture

принято

<pre><?php
function generateArray($number) // функция создание массива случайных чисел
{   
    for ($i = 0; $i < $number; $i ++) { // циклом задаем массив
        $arr[] = rand(1, 20);       // случайными числами в диапазоне [1..20]
    }
    print_r($arr); // для наглядности проверки кода
    return $arr;
}
      
function compareArr($firstArray, $secondArray)
{	
	foreach ($firstArray as $firstArraysElement) {    // обходим первый массив
		if (!in_array($firstArraysElement, $secondArray))    // если очередной элемент первого массива не содержится в втором массиве, то
			$resultArray[] = $firstArraysElement;     // заносим значение этого элемента в массив $resultArray
    }
    return $resultArray;
}
      
$firstArray = generateArray(10); // из этого массива $firstArray исключаем все элементы, которые
$secondArray = [12, 5, 17, 6, 4];     // содержаться в этом массиве $secondArray
$resultArray = compareArr($firstArray, $secondArray);
print_r($resultArray);   // для наглядности проверки кода
      
foreach ($resultArray as $v) {   // обходим массив, выводя его элементы
    echo $v. ' ';
}
?>
vedro-compota's picture

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

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