Учебные задачи PHP. Задача 14
Primary tabs
Решение для задачи из списка
<?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;
}
?>
- Log in to post comments
- 11791 reads
toyrik
Fri, 09/13/2019 - 21:38
Permalink
Второй вариант
<?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
Mon, 09/16/2019 - 23:13
Permalink
замечания
1)
-- решение хорошее, но использовать тут переменную $concurrence вовсе не обязательно, дайте альтернативное решение, без этой переменной ну и за одно без использования массива для результата (печатайте прямо в функции).
2)
в реальной разработке конечно надо использовать готовые функции, в т.ч. потому что они работают сильно быстрее, но тут стоит цель проверить возможности алгоритмизации, поэтому запрашиваем разные способы решения.
_____________
матфак вгу и остальная классика =)
toyrik
Tue, 09/17/2019 - 10:52
Permalink
Альтернатива без массива
<?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." » "; 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
Tue, 09/17/2019 - 10:57
Permalink
а если бы было 100000 элементов?
а если бы элементов в массиве было 100000 ? Такое вообще никогда писать не следует. Исправьте.
_____________
матфак вгу и остальная классика =)
toyrik
Tue, 09/17/2019 - 12:08
Permalink
Поправил
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." » "; } else { continue; } } } } }vedro-compota
Tue, 09/17/2019 - 23:03
Permalink
замечания и сомнения
if ($valueOne == $arrayTwo[$i]) { break; } else-- это явно лишнее, можно использовать if в неполной форме....и потом вообще есть сомнения, что этот код правильный. Дайте версию, которую можно запустить - с вызовом функции и формированием массивов
_____________
матфак вгу и остальная классика =)
toyrik
Tue, 09/17/2019 - 23:10
Permalink
Как то так....
$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." » "; } 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
Tue, 09/17/2019 - 23:18
Permalink
замечания
-- в этом блоке не нужны ни break; (меняем условие на обратное) ни continue; (т.к. тут это оператор вообще в конце витка приведен)
_____________
матфак вгу и остальная классика =)
toyrik
Sun, 09/22/2019 - 13:31
Permalink
Ну...
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." » "; } } 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
Sun, 09/22/2019 - 21:00
Permalink
хорошо, далее переделайте так
хорошо, далее переделайте так, чтобы внутренний цикл обходился без проверки вложенных if-ом:
_____________
матфак вгу и остальная классика =)
toyrik
Mon, 09/23/2019 - 12:01
Permalink
Не смог придумать ничего умнее..
А чем плох внутренний 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." » "; } } } 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
Mon, 09/23/2019 - 12:05
Permalink
А чем плох внутренний if?
лишней операцией на сравнение и лишним кодом, а вот переменную-флаг можно было бы назвать и более понятным образом)
Задача засчитана)
_____________
матфак вгу и остальная классика =)