Как я могу случайно выбрать и удалить имя из массива в PHP? - PullRequest
0 голосов
/ 12 марта 2020

Я новичок ie в программировании (так что не переживайте sh), и наши преподаватели подталкивают нас к разработке с использованием TDD с самого начала.

Я делать небольшую программу, которая выбирает случайное имя. Один из моих тестов пытается проверить, что одно и то же имя не выбирается дважды, но тест не всегда проходит.

Это функция, которая случайно выбирает кого-то. Что я выбрал метод shift (), потому что он удаляет первый элемент массива.

public function random($coders) {

        $coders = ['Paul', 'John', 'Brad'];

        shuffle($coders);
        $pickedCoder = array_shift($coders);

        return $pickedCoder;
    }  

Это тест:

public function testCoderNotKilledTwice()
    { 
        $coders = ['Paul', 'John', 'Brad'];

        $killer = new Killer();
        $deadCoder1 = $killer->random($coders);
        $deadCoder2 = $killer->random($coders);

        $this->assertNotEquals($deadCoder1, $deadCoder2);
    }

Что я делаю не так?

1 Ответ

0 голосов
/ 12 марта 2020

"Я выбрал метод shift (), потому что он УДАЛЯЕТ первый элемент массива."

... конечно, но тогда $coders = ['Paul', 'John', 'Brad']; внутри вашего "random ()" Функция все равно каждый раз заново создает массив с исходными значениями. Изменения, сделанные вами с помощью shift (), не сохраняются между вызовами функции random (). И даже если вы удалили это, каждый раз, когда вы вызываете $killer->random($coders);, он также передает исходный массив.

Вам необходимо определить $coders как (приватное) свойство на уровне класса, поэтому его значение сохраняется между вызовами функции random (). Нет необходимости объявлять $ coders внутри функции random () или передавать копию функции в качестве аргумента.

Примерно так:

class Killer {
  private $coders = ['Paul', 'John', 'Brad'];

  public function random() {
    shuffle($this->coders);
    $pickedCoder = array_shift($this->coders);
    return $pickedCoder;
  }  
}

И затем:

public function testCoderNotKilledTwice()
{ 
  $killer = new Killer();
  $deadCoder1 = $killer->random();
  $deadCoder2 = $killer->random();
  $this->assertNotEquals($deadCoder1, $deadCoder2);
}

Имейте в виду, конечно, что вы также можете учесть сценарий, в котором у вас больше не осталось элементов в массиве, чтобы вернуть значение. Я не знаю, сколько раз вы ожидаете, что сможете успешно запустить функцию random ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...