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

Решение для задачи из списка

<?php

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


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showArray(showDiff($needlesArray, $arrayHaystacks));

	function showDiff($arrayOne,$arrayTwo)
	{
		$differences = [];
		foreach ($arrayOne as $value) {
			if (in_array($value, $arrayTwo)){
				continue;
			} else {
				$differences[] = $value;
			}
		}
		return $differences;
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>
toyrik's picture

<?php

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


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showArray(showDiff($needlesArray, $arrayHaystacks));

	function showDiff($arrayOne,$arrayTwo)
	{
		$differences = [];
		
		foreach ($arrayOne as $valueOne) {
			$concurrence = false;
			foreach ($arrayTwo as $valueTwo) {
				if ($valueOne == $valueTwo) {
					$concurrence = true;
					break;
				} else {
					continue;
				}
			}
			if($concurrence){
				continue;
			} else {
				$differences[] = $valueOne;
			}
		}
		return $differences;
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>

Ну так то понятно что использование включённых в язык функций удобнее,
хотя и в них есть свои особенности
(примеров привести не могу, но наверняка есть...)

vedro-compota's picture

1)

foreach ($arrayTwo as $valueTwo) {
                if ($valueOne == $valueTwo) {
                    $concurrence = true;
                    break;
                } else {
                    continue;
                }
            }
            if($concurrence){
                continue;
            } else {
                $differences[] = $valueOne;
            }

-- решение хорошее, но использовать тут переменную $concurrence вовсе не обязательно, дайте альтернативное решение, без этой переменной ну и за одно без использования массива для результата (печатайте прямо в функции).

2)

Ну так то понятно что использование включённых в язык функций удобнее,
хотя и в них есть свои особенности
(примеров привести не могу, но наверняка есть...)

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

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

toyrik's picture

<?php

	/**
	 * Решение для задачи №14 из курса PHP
	 *
	 * Есть два массива "a" и "b". На вход вашей программе подаётся массив "a"
	 * случайных чисел (10 элементов) из диапазона от 1 до 20.
	 * Задача: вывести на экран все числа, которые не содержатся в массиве "b"
	 * $b = [12, 5, 17, 6, 4];
	 * Решите эту задачу двумя способами:
	 * Без использования in_array() (link is external)
	 * С использованием in_array() (link is external) (что проще)
	 * 
	 * UPD  дайте альтернативное решение, без этой переменной без переменной $concurrence ну и за одно без использования массива для результата (печатайте прямо в функции).
	 */
	$arraysCount = 10;
	$needlesArray = getRandomArray($arraysCount);
	$arrayHaystacks = getRandomArray($arraysCount);


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showDiff($needlesArray, $arrayHaystacks);

	function showDiff($arrayOne,$arrayTwo)
	{
		foreach ($arrayOne as $valueOne) {
			switch ($valueOne) {
				case $arrayTwo[0]:
				case $arrayTwo[1]:
				case $arrayTwo[2]:
				case $arrayTwo[3]:
				case $arrayTwo[4]:
				case $arrayTwo[5]:
				case $arrayTwo[6]:
				case $arrayTwo[7]:
				case $arrayTwo[8]:
				case $arrayTwo[9]:
					break;
				default:
					echo $valueOne." &raquo ";
					break;
			}
		}
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>
vedro-compota's picture

switch ($valueOne) {
                case $arrayTwo[0]:
                case $arrayTwo[1]:
                case $arrayTwo[2]:
                case $arrayTwo[3]:
                case $arrayTwo[4]:
                case $arrayTwo[5]:
                case $arrayTwo[6]:
                case $arrayTwo[7]:
                case $arrayTwo[8]:
                case $arrayTwo[9]:

а если бы элементов в массиве было 100000 ? Такое вообще никогда писать не следует. Исправьте.

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

toyrik's picture

	function showDiff($arrayOne,$arrayTwo)
	{
		foreach ($arrayOne as $valueOne) {
			for ($i=0; $i < count($arrayTwo); $i++) { 
				if ($valueOne == $arrayTwo[$i]) {
					break;
				} else {
					if($i == (count($arrayTwo)-1)){
						echo $valueOne." &raquo ";
					} else {
                        continue;
					}
				}
			}
		}
	}
vedro-compota's picture

  1. для обхода внутреннего массива лучше тоже использовать foreach
  2. if ($valueOne == $arrayTwo[$i]) {
                    break;
                } else

    -- это явно лишнее, можно использовать if в неполной форме....и потом вообще есть сомнения, что этот код правильный. Дайте версию, которую можно запустить - с вызовом функции и формированием массивов

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

toyrik's picture

$arraysCount = 10;
	$needlesArray = getRandomArray($arraysCount);
	$arrayHaystacks = getRandomArray($arraysCount);


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showDiff($needlesArray, $arrayHaystacks);

	function showDiff($arrayOne,$arrayTwo)
	{
		foreach ($arrayOne as $valueOne) {
			for ($i=0; $i < count($arrayTwo); $i++) { 
				if ($valueOne == $arrayTwo[$i]) {
					break;
				} else {
					if($i == (count($arrayTwo)-1)){
						echo $valueOne." &raquo ";
					} else {
                        continue;
					}
				}
			}
		}
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>
vedro-compota's picture

 for ($i=0; $i < count($arrayTwo); $i++) { 
                if ($valueOne == $arrayTwo[$i]) {
                    break;
                } else {
                    if($i == (count($arrayTwo)-1)){
                        echo $valueOne." &raquo ";
                    } else {
                        continue;
                    }
                }
            }

-- в этом блоке не нужны ни break; (меняем условие на обратное) ни continue; (т.к. тут это оператор вообще в конце витка приведен)

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

toyrik's picture

break там всё равно будет нужен, иначе будут выводится все числа первого массива.

<?php

	$arraysCount = 10;
	$needlesArray = getRandomArray($arraysCount);
	$arrayHaystacks = getRandomArray($arraysCount);


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showDiff($needlesArray, $arrayHaystacks);

	function showDiff($arrayOne,$arrayTwo)
	{
		foreach ($arrayOne as $valueOne) {
			for ($i=0; $i < count($arrayTwo); $i++) { 
				if ($valueOne != $arrayTwo[$i]) {
					if($i == (count($arrayTwo)-1)){
						echo $valueOne." &raquo ";
					}
				} else {
					break;
				}
			}
		}
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>
vedro-compota's picture

хорошо, далее переделайте так, чтобы внутренний цикл обходился без проверки вложенных if-ом:

if($i == (count($arrayTwo)-1)){
                        echo $valueOne." &raquo ";
                    }

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

toyrik's picture

А чем плох внутренний if?

<?
    $arraysCount = 10;
	$needlesArray = getRandomArray($arraysCount);
	$arrayHaystacks = getRandomArray($arraysCount);


	echo "В первом массиве:<br>";
	showArray($needlesArray);
	echo "<br>Во втором массиве:<br>";
	showArray($arrayHaystacks);
	echo "<br>Элементы первого массива отсутствующие во втором:<br>";
	showDiff($needlesArray, $arrayHaystacks);

	function showDiff($arrayOne,$arrayTwo)
	{
		foreach ($arrayOne as $valueOne) {
            $flag = true;
			for ($i=0; $i < count($arrayTwo); $i++) { 
				if ($valueOne == $arrayTwo[$i]) {
                    $flag = false;
					break;
				}
            }
            if($flag){
						echo $valueOne." &raquo ";
					}
		}
	}

	function showArray($array)
	{
		foreach ($array as $key => $value) {
			echo $key." - ".$value."<br>";
		}
	}

	function getRandomArray($count)
	{
		$numbers = [];

		for ($i = 0; $i < $count; $i++) {
			$numbers[$i] = rand(1, 20);
		}
		return $numbers;
	}
?>
vedro-compota's picture

А чем плох внутренний if?

лишней операцией на сравнение и лишним кодом, а вот переменную-флаг можно было бы назвать и более понятным образом)

Задача засчитана)

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