w3bsme
@w3bsme
Интересное хуже

Как упростить и ускорить выполнение данного кода?

<?
class Santa {

    public function setArray($to) {
        $result = array();
        for ($i=0; $i <= $to; $i++) {;
            array_push($result, $i);
        }
        return $result;
    }

    public function Printing ($input){
        foreach ($input as $value) {
            echo "<h5>$value</h5>";
        }
    }

    /**
     * Перемешивание случайным образом массива чисел с учётом того,
     * чтобы значения исходного и полученного массивов по идентичным индексам не дублировались
     * @param array $list исходный массив чисел
     * @return array перемешанный массив
     */
    public function randomArray($list) {
        $target = array();
        $used = array();
        foreach ($list as $k=>$v) {
            $tmp = $list;
            //удаляем первое значение пары
            array_shift($tmp);
            unset($tmp[$k]);
            //удаляем ранее использованные вторые значения пар
            foreach ($used as $u)
                if (($i = array_search($u, $tmp)) !== false)
                    unset($tmp[$i]);
            $tk = array_rand($tmp);
            $t = $tmp[$tk];
            $target[$k] = $t;
            $used[] = $t;
        }
        return $this->Printing($target);
    }

}

$Santa = new Santa;
$Santa->randomArray($Santa->setArray(100));
  • Вопрос задан
  • 658 просмотров
Пригласить эксперта
Ответы на вопрос 2
@EvgeniiR
https://github.com/EvgeniiR
spoiler

Вопрос как сделать поприятнее сами методы? Просто у этого класса есть ещё явные проблемы с точки зрения архитектуры.
Я бы помог, но не могу даже с комментариями понять что должен сделать метод randomArray.

По порядку:
1. Советую почитать советы по стилю кода PSR1, PSR2 (легко гуглятся).
2. Имена переменных. Что такое $target, $used не понятно вообще. Имена у переменных должны быть осмысленные. Имена из одной буквы допускаются в крайне редких случаях, когда у переменной очень маленькая область видимости(1-3 строчки), и из контекста понятно что она обозначает.
3. Метод randomArray вызывает метод Printing и возвращает его значение, а метод Printing в свою очередь ничего не возвращает, а лишь печатает данные в поток вывода. Думаю там что-то другое должно быть в return.
4. Можно указывать тип аргументов в методах:
public function func1(array $inputArgumentTypeOfArray) {...}

В последних версиях PHP можно указывать также возвращаемое методом значение
public function func1(array $inputArgumentTypeOfArray): int // Integer
public function func1(array $inputArgumentTypeOfArray):? int // Integer или null


Функцию setArray можно реализовать так:
/**
 * @param int $lastNumber
 * @return array
 */
public function createArray(int $lastNumber): array {
    return range(0, $lastNumber);
}


UPD: Santa оказался новогодним тайным сантой. А задача кода - вывести по заданному числу N (количество участников) ряд чисел, где порядковый номер числа обозначает номер дарящего, а само число - номер того кому дарят подарок таким образом, чтобы никому не пришлось дарить подарок самому себе.
Решение по идее такое:
function getAnswer(int $personsCount) {
    for($i = 1; $i < $personsCount; $i++) {
        echo $i + 1 . " ";
    }
    echo 1;
}

$input = trim(fgets(STDIN));
getAnswer($input);
Ответ написан
prototype_denis
@prototype_denis
Symfony
$first = \range(0, 10000);
$second = $first;
do {
    \shuffle($second);
} while ([] !== \array_intersect_assoc($first, $second));

// if 1 !== \max(\array_count_values($first) // potential infinite loop
// If \count($first) < 2) // infinite loop

// 10000     ~0.001s
// 100000    ~0.03s
// 1000000   ~0.3s
// 10000000  ~8s
// 100000000 ~26s
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
IMAGINWEB Москва
от 55 000 до 85 000 руб.
Владис Владимир
от 100 000 до 150 000 руб.
Индекс.СРО Ростов-на-Дону
от 45 000 до 70 000 руб.
25 июн. 2019, в 00:24
15000 руб./за проект
24 июн. 2019, в 23:27
8000 руб./за проект