如何在PHP中从数组中随机选择和删除名称?

问题描述 投票:0回答:1

我是编程的新手(所以不要太苛刻),我们的讲师从一开始就敦促我们使用TDD进行开发。

我正在做一个小程序,选择一个随机名称。我的测试之一尝试测试同一名称没有被两次选择,但是测试并不总是通过。

这是随机选择某人的功能。我之所以选择shift method(),是因为它删除了数组的第一个元素。

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

我做错了什么?

php tdd
1个回答
0
投票

“我选择了shift方法(),因为它删除了数组。“

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

您需要在类级别将$coders定义为(私有)属性,因此其值在对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);
}
© www.soinside.com 2019 - 2024. All rights reserved.