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

Задача из списка

<?php
/*Даны два массива по 20 элементов каждый.
Сравните каждый 3-ий элемент 1-ого массива с каждый 2-ым элементов 2-ого массива
 - сравнение проводите пока не закончится та выборка, которая короче.*/
function createArray()
{
	for ($i = 1; $i <= 20; $i++) {
		$arr1[$i] = rand(-50, 50);
		$arr2[$i] = rand(-50, 50);
	}
	for ($i = 3, $j = 2; $i <= 20; $i += 3, $j += 2) {
		if ($arr1[$i] < $arr2[$j]) {
			echo "$arr1[$i] меньше $arr2[$j]<br>";
		} elseif ($arr1[$i] > $arr2[$j]) {
			echo "$arr1[$i] больше $arr2[$j]<br>";
		} else {
			echo "$arr1[$i] равно $arr2[$j]<br>";
		}
	}
}
createArray();

/*

Почему при вызове функции compareItems() массивы не определяются?
 <?php
$arr1 = array(); 
$arr2 = array();
function createArray()
{
	for ($i = 1; $i <= 20; $i++) {
		$arr1[$i] = rand(-50, 50);
		$arr2[$i] = rand(-50, 50);
	}
        return $arr1;
        return $arr2;
}

function compareItems($arr1, $arr2) 
{
	for ($i = 3, $j = 2; $i <= 20; $i += 3, $j += 2) {
		if ($arr1[$i] < $arr2[$j]) {
			echo "$arr1[$i] меньше $arr2[$j]<br>";
		} elseif ($arr1[$i] > $arr2[$j]) {
			echo "$arr1[$i] больше $arr2[$j]<br>";
		} else {
			echo "$arr1[$i] равно $arr2[$j]<br>";
		}
	}
}
compareItems(createArray());

*/

/* Почему при вызове функции compareItems() массивы не определяются? */
function createArray()
{
    $arr1 = array();
    $arr2 = array();
    for ($i = 1; $i <= 20; $i++) {
        $arr1[$i] = rand(-50, 50);
        $arr2[$i] = rand(-50, 50);
    }
    return array($arr1, $arr2);
}

function compareItems($arr1, $arr2)
{
    for ($i = 3, $j = 2; $i <= 20; $i += 3, $j += 2) {
        if ($arr1[$i] < $arr2[$j]) {
            echo "$arr1[$i] меньше $arr2[$j]<br>";
        } elseif ($arr1[$i] > $arr2[$j]) {
            echo "$arr1[$i] больше $arr2[$j]<br>";
        } else {
            echo "$arr1[$i] равно $arr2[$j]<br>";
        }
    }
}
compareItems(...createArray());
vedro-compota's picture

return $arr1;
return $arr2; // это недостижимый код

можно вернуть только одно значение, return будучи вызван один раз прекращает работу текущей функции.

Почему при вызове функции compareItems() массивы не определяются?

потому что вы их туда не паредаёте, точнее вы передаете вызов функции, которая возвращает только один массив, а потому один массив и получаете.

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

vedro-compota's picture

выше @math2 привел возможное решение проблемы передачи двух параметров, но
более простым и понятным способом является следующий подхода:

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

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

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

Благодарю за ответы. Стало намного понятнее. По итогам у меня получилось так.

<?php
function createArray()
{
    $arr = array();
    for ($i = 1; $i <= 20; $i++) {
        $arr[$i] = rand(-50, 50);
    }
    return $arr;
}
function compareItems()
{
	$arr1 = createArray();
	$arr2 = createArray();
    for ($i = 3, $j = 2; $i <= 20; $i += 3, $j += 2) {
        if ($arr1[$i] < $arr2[$j]) {
            echo "$arr1[$i] меньше $arr2[$j]<br>";
        } elseif ($arr1[$i] > $arr2[$j]) {
            echo "$arr1[$i] больше $arr2[$j]<br>";
        } else {
            echo "$arr1[$i] равно $arr2[$j]<br>";
        }
    }
}
compareItems();
vedro-compota's picture

function compareItems()

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

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

<?php
function createArray()
{
    $arr = array();
    for ($i = 1; $i <= 20; $i++) {
        $arr[$i] = rand(-50, 50);
    }
    return $arr;
}

$arr1 = createArray();
$arr2 = createArray();

function compareItems($arr1, $arr2)
{
	for ($i = 3, $j = 2; $i <= 20; $i += 3, $j += 2) {
        if ($arr1[$i] < $arr2[$j]) {
            echo "$arr1[$i] меньше $arr2[$j]<br>";
        } elseif ($arr1[$i] > $arr2[$j]) {
            echo "$arr1[$i] больше $arr2[$j]<br>";
        } else {
            echo "$arr1[$i] равно $arr2[$j]<br>";
        }
    }
}

compareItems($arr1, $arr2);

1. Я правильно понял комментарий? Если не так понял, то можно пояснить?
2. Не могу понять, зачем здесь перебирать все значения циклом foreach, когда можно просто напрямую к нужным значениям массива обращаться?

vedro-compota's picture

1. Я правильно понял комментарий? Если не так понял, то можно пояснить?

правильно

. Не могу понять, зачем здесь перебирать все значения циклом foreach, когда можно просто напрямую к нужным значениям массива обращаться?

Ваше решение проще, чем перебор форичем, и м.б. даже лучше в данной ситуации.
Решение засчитано.

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