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));
  • Вопрос задан
  • 637 просмотров
Пригласить эксперта
Ответы на вопрос 2
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
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Ticketland.ru Москва
от 120 000 руб.
Интерно Ростов-на-Дону
от 35 000 до 50 000 руб.
20 янв. 2019, в 00:12
16000 руб./за проект
19 янв. 2019, в 23:33
110000 руб./за проект