我如何随机 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() 函数成功执行多少次。
我是编程新手(所以不要太苛刻),我们的导师从一开始就敦促我们使用 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() 函数成功执行多少次。