Задача №7. Задать массив из 7-ми элементов через предварительное описание типа, заполнить его случайными значениями в одном цикл

Задача из этого списка.

<?php
/* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
 * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
function arr() {
	for($a = 7; $a > 0; $a--) {
		$array[] = rand();
    }
    foreach($array as $elem) {
		echo $elem, '<br>';
    }
}
arr();	
?>

Key Words for FKN + antitotal forum (CS VSU):

melisa's picture

  1. Всегда инициализируйте переменные "снаружи" цикла.
    Это:
    $array[] = rand();

    и это:

    foreach($array as $elem)

    - уже использование переменной $array. Предположим, тело цикла for по каким-то причинам не выполнилось ни разу и присвоение не произошло. Второй случай использования $array выдаст ошибку "Undefined variable".
    Лучше заранее присвоить $array пустое значение, тогда ошибки не возникнет, заодно будет понятно, что в ней будет массив:

    $array = [];
    
        for($a = 7; $a > 0; $a--) {
            $array[] = rand();
        }
    
        foreach($array as $elem) {
            echo $elem, '<br>';
        }
  2. Раз уж вы оборачиваете код в функции, давайте разделим его логически. Напишите 2 функции и назовите их в соответствии с тем, что они делают. Доп. задание: первая функция может принимать аргумент. Что бы вы передали в качестве аргумента?
Sver4ok's picture

<?php
/* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
 * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
function fillArrayWithRandomElements($a) {
	for(; $a > 0; $a--) {
		$array[] = rand();
    }
    return $array;
}
function outputArray($array) {
    foreach($array as $elem) {
		echo $elem, '<br>';
    }
}
$array = [];
$array = fillArrayWithRandomElements(7); // 7 - по условию задачи
outputArray($array);
melisa's picture

да, да, очень круто) с функциями.
а вот объявление массива не там. Вы объявили не тот массив.

$array[] = rand();

и

$array = fillArrayWithRandomElements(7); 

это совершенно разные переменные. Почему?

Sver4ok's picture

А, точно, нужно в функцию впихнуть же пустой массив, так?

<?php
/* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
 * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
function fillArrayWithRandomElements($a, $array) {
	for(; $a > 0; $a--) {
		$array[] = rand();
    }
    return $array;
}
function outputArray($array) {
    foreach($array as $elem) {
		echo $elem, '<br>';
    }
}
$array = [];
$array = fillArrayWithRandomElements(7, $array); // 7 - по условию задачи
outputArray($array);
melisa's picture

ни в коем случае. Аргумент, принимаемый функцией обязательно должен нести какой-то смысл, а также он меняется от вызова к вызову.
Замечание об объявлении массива относилась к области видимости функции. Почитайте и ответьте всё таки на вопрос:

$array[] = rand();

и

$array = fillArrayWithRandomElements(7); 

это совершенно разные переменные. Почему?

Sver4ok's picture

Я понимаю что разные переменные, потому что я по сути создаю опять переменную под этим же названием.
Типа такого? Но оно не работает так, $array не хочет выводится иначе в глобалку, не понимаю в чём дело)

<?php
/* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
 * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
function fillArrayWithRandomElements($a, $array) {
	for(; $a > 0; $a--) {
		$array[] = rand();
    }
    return $array;
}
function outputArray($array) {
    foreach($array as $elem) {
		echo $elem, '<br>';
    }
}
$array = [];
fillArrayWithRandomElements(7, $array); // 7 - по условию задачи
outputArray($array);
melisa's picture

  1. Прочитайте про области видимости
  2. Дайте разным переменным разные имена, чтобы не путаться.

Дальше обсудим, что не работает.

Sver4ok's picture

1) прочитал, и до этого читал есессна.
2)Переименовал переменные
Всё работает, что тут не так?

<?php
/* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
 * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
function fillArrayWithRandomElements($a, $array) {
	for(; $a > 0; $a--) {
		$array[] = rand();
    }
    return $array;
}
function outputArray($array2) {
    foreach($array2 as $elem) {
		echo $elem, '<br>';
    }
}
$array = [];
$array2 = fillArrayWithRandomElements(7, $array); // 7 - по условию задачи
outputArray($array2);
melisa's picture

  1. Ответьте, раз прочитали, на свой вопрос:
    Но оно не работает так, $array не хочет выводится иначе в глобалку, не понимаю в чём дело)

    Почему не выводился массив на экран?

    и до этого читал есессна

    Если бы так, то вопрос не возник бы.

  2. прочитал

    Если так, то третий раз уже задаю вопрос:

    $array[] = rand();

    и

    $array = fillArrayWithRandomElements(7); 

    это совершенно разные переменные. Почему?

Sver4ok's picture

Почему не выводился массив на экран?

Изначально всё выводилось и в последней правке всё выводится, потому что я правильно всё сделал.

это совершенно разные переменные. Почему?

Потому что в

$array[] = rand

- записывает тот пустой массив.
А

$array = fillArrayWithRandomElements(7)

- тут уже создаёт новый массив и присваивает значения из старого массива, как я понимаю.

melisa's picture

Потому что в

$array[] = rand

- записывает тот пустой массив.
А

$array = fillArrayWithRandomElements(7)

- тут уже создаёт новый массив и присваивает значения из старого массива, как я понимаю.

По Вашему вторая строка переопределяет $array из первой строки?

Sver4ok's picture

Мы друг друга видимо вообще не понимаем.
Объясню ход моих мыслей: вызывается функция, там создаётся локальная временная переменная - это значит создаётся кусок временной области памяти, в ней записывается этот массив array, далее return что-то делает с этой областью, потому как после return уже не существует этой переменной в функции. Тогда по логике return уничтожает эту переменную или "теряется", после того, как функция выведет эту переменную в глобальную переменную:

$array = fillArrayWithRandomElements(7)

Если попытаться просто вывести

fillArrayWithRandomElements(7)

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

melisa's picture

  1. Имена и область определения переменных.
    Вы словами правильно описываете локальные и глобальные переменные, а поименовали их не правильно:
    <?php
    /* Задать массив из 7-ми элементов через предварительное описание типа, заполнить его 
     * случайными значениями в одном цикле, а в другом цикле вывести эти значения на экран. */
    function fillArrayWithRandomElements($a, $array) {
        for(; $a > 0; $a--) {
            $array[] = rand();
        }
        return $array;
    }
    function outputArray($array2) {
        foreach($array2 as $elem) {
            echo $elem, '<br>';
        }
    }
    $array = [];
    $array2 = fillArrayWithRandomElements(7, $array); // 7 - по условию задачи
    outputArray($array2);

    В обоих функциях Вы одинаково назвали глобальные переменные (которые передаёте в функцию) и локальные (которые используете внутри функции). Для fillArrayWithRandomElements() и outputArray() это $array и $array2 соответственно. Хотя $array снаружи и $array внутри - это РАЗНЫЕ переменные. И $array2 снаружи и $array2 внутри - это РАЗНЫЕ переменные Вот это я от вас и хотела услышать.

    Итак, в связи с этим, если Вам требуется передать массив в функцию, то его следует назвать отдельным именем, не совпадающим с именем локальной переменной внутри функции:

    <?php
    function fillArrayWithRandomElements($a, $existingArray) {
        for(; $a > 0; $a--) {
            $existingArray[] = rand();
        }
        return $existingArray;
    }
    function outputArray($anyArray) {
        foreach($anyArray as $elem) {
            echo $elem, '<br>';
        }
    }
    $someArray = [];
    $someArrayWithRandomElements = fillArrayWithRandomElements(7, $someArray);
    outputArray($someArrayWithRandomElements);

    а ещё лучше избежать создания лишних переменных, передав fillArrayWithRandomElements() прямо в outputArray() как аргумент:

    $someArray = [];
    outputArray(fillArrayWithRandomElements(7, $someArray));
  2. Объявление массива.
    Вы вынесли объявление массива из функции наружу.
    $array = [];

    Это неверно. Если при повторном использовании функции, в неё будет передан, например, не пустой массив, то rand() добавит 7 элементов к уже имеющимся. Такое поведение функции задачей не предусмотрено. Никакой массив fillArrayWithRandomElements() принимать не должна.

    Создание пустого массива должно происходить в самой функции (т.к. это потребуется при каждом её вызове):

    <?php
    function fillArrayWithRandomElements($a) {
        $newArray = [];
        for(; $a > 0; $a--) {
            $newArray[] = rand();
        }
        return $newArray;
    }
    
    function outputArray($anyArray) {
        foreach($anyArray as $elem) {
            echo $elem, '<br>';
        }
    }
    
    outputArray(fillArrayWithRandomElements(7));
Sver4ok's picture

И array2 снаружи и array2 внутри - это РАЗНЫЕ переменные

Ну вот я сразу и сказал что это разные переменные, я имел ввиду что не разные по значению, а разные области памяти, то бишь 2 переменные, одна array и вторая array, а совмещается это всё благодаря области видимости это что вы скидывали.

Вы вынесли объявление массива из функции наружу.

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

Итак, в связи с этим, если Вам требуется передать массив в функцию, то его следует назвать отдельным именем, не совпадающим с именем

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

melisa's picture

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

Я Вам чёткую задачу дала: дайте разным переменным разные имена. Вот здесь: http://fkn.ktu10.com/?q=comment/2514#com... Это нужно было для того, чтобы узнать, понимаете ли Вы, какие переменные разные, а какие - нет. Переименовали Вы неверно (см. мой предыдущий комментарий). Я не собираюсь обсуждать, что Вы думали и имелли ввиду:

Болтовня ничего не стоит. Покажите мне код
(с) Linus Torvalds

Я тут с Вами переписываюсь для того, чтобы Вы говорили "во-во, я так и говорил вообще" для того чтобы Вы материал освоили правильно, а не с неожиданным видинием.
Читайте внимательно вопросы. Читайте внимательно замечания.

Принято, переходим к следующей задаче.