我如何随机 select 并从 PHP 中的数组中删除名称?

How can I randomly select and remove a name from an array in PHP?

我是编程新手(所以不要太苛刻),我们的导师从一开始就敦促我们使用 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);
    }

我做错了什么?

"I choosed the shift method() because it REMOVES the first element of an array."

...当然可以,但是 "random()" 函数中的 $coders = ['Paul', 'John', 'Brad']; 每次都会使用原始值重新创建数组。您使用 shift() 所做的更改不会保留在对 "random()" 的调用之间。即使您删除了它,每次调用 $killer->random($coders); 时它也会传递原始数组。

您需要将 $coders 定义为 class 级别的(私有)属性,因此它的值在对 random() 函数的调用之间保持不变。无需在 random() 函数中声明 $coders,也无需将副本作为参数传递给函数。

像这样:

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);
}

当然请记住,您可能还想考虑数组中不再有足够的项来 return 值的情况。我不知道您希望 运行 random() 函数成功执行多少次。