在PHP和I';我得到一个超出范围的错误
我对PHP完全是新手,我的代码中有一个逻辑问题(我认为array_rand($arrCards,1)在应该使用的元素之前就用完了)。因此,我对数组进行了var_转储,得到了以下输出(简要摘录): 这是我的卡片分类:在PHP和I';我得到一个超出范围的错误,php,arrays,class,methods,Php,Arrays,Class,Methods,我对PHP完全是新手,我的代码中有一个逻辑问题(我认为array_rand($arrCards,1)在应该使用的元素之前就用完了)。因此,我对数组进行了var_转储,得到了以下输出(简要摘录): 这是我的卡片分类: class Card { //properties private $suit; private $rank; //constructor public function __construct($r, $s) { $this
class Card {
//properties
private $suit;
private $rank;
//constructor
public function __construct($r, $s) {
$this->rank = $r;
$this->suit = $s;
}
//methods
public function getSuit() {
return $this->suit;
}
public function getRank() {
return $this->rank;
}
}
//constructor
public function __construct() {
$this->arrCards = array();
$objCard = new Card("a", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("2", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("3", "heart");
blah blah continued...
//methods
public function dealCard() {
if ($this->hasCard()) {
echo $this->intCount . PHP_EOL;
$index = array_rand($this->arrCards, 1);
$card = array_splice($this->arrCards,$index);
return $card[0];
} else {
return Null;
}
}
protected function hasCard() {
if ($this->intCount > 0) {
return true;
} else {
return false;
}
}
下面是我如何创建每张卡并将其推入每个阵列(这是卡组类构造函数):
class Card {
//properties
private $suit;
private $rank;
//constructor
public function __construct($r, $s) {
$this->rank = $r;
$this->suit = $s;
}
//methods
public function getSuit() {
return $this->suit;
}
public function getRank() {
return $this->rank;
}
}
//constructor
public function __construct() {
$this->arrCards = array();
$objCard = new Card("a", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("2", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("3", "heart");
blah blah continued...
//methods
public function dealCard() {
if ($this->hasCard()) {
echo $this->intCount . PHP_EOL;
$index = array_rand($this->arrCards, 1);
$card = array_splice($this->arrCards,$index);
return $card[0];
} else {
return Null;
}
}
protected function hasCard() {
if ($this->intCount > 0) {
return true;
} else {
return false;
}
}
(有人向我指出,我本可以使用两个for循环来构建甲板,但我现在已经全部打印出来了,所以这可能无关紧要。)
下面是Deck类中的相关方法:
class Card {
//properties
private $suit;
private $rank;
//constructor
public function __construct($r, $s) {
$this->rank = $r;
$this->suit = $s;
}
//methods
public function getSuit() {
return $this->suit;
}
public function getRank() {
return $this->rank;
}
}
//constructor
public function __construct() {
$this->arrCards = array();
$objCard = new Card("a", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("2", "heart");
array_push($this->arrCards, $objCard);
$objCard = new Card("3", "heart");
blah blah continued...
//methods
public function dealCard() {
if ($this->hasCard()) {
echo $this->intCount . PHP_EOL;
$index = array_rand($this->arrCards, 1);
$card = array_splice($this->arrCards,$index);
return $card[0];
} else {
return Null;
}
}
protected function hasCard() {
if ($this->intCount > 0) {
return true;
} else {
return false;
}
}
下面是我得到的错误(前面是echo$this->intCount;
(请注意,它实际上并没有像我所希望的那样将卡从卡组中移除):
将从输入数组返回一个随机键,而偏移量为正值时,将从数组的开头开始从数组中删除那么多元素 例如:
$deck = ['A','K','Q','J','10','9','8','7','6','5','4','3','2','1'];
$card = array_rand($deck,1);
print $card . PHP_EOL;
// let's assume it outputs 9, this is the key from the array
// array_rand returns a random key from the input array
$remainingDeck = array_splice($deck,$card);
print_r($remainingDeck) . PHP_EOL;
// will output
Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
[4] => 1
)
这不是你所期望的,我们已经从牌组中删除了9张牌,而不是一张
你得到的警告是,在发了几张牌后,你的牌组是空的。
您可以在处理每张卡后打印出$this->arrCards
的计数来轻松验证这一点,而不是依赖$this->intCount
,该计数在处理卡后不会更新。将从您的输入数组中返回一个随机键,而
偏移量为正值时,将从数组的开头开始从数组中删除那么多元素
例如:
$deck = ['A','K','Q','J','10','9','8','7','6','5','4','3','2','1'];
$card = array_rand($deck,1);
print $card . PHP_EOL;
// let's assume it outputs 9, this is the key from the array
// array_rand returns a random key from the input array
$remainingDeck = array_splice($deck,$card);
print_r($remainingDeck) . PHP_EOL;
// will output
Array
(
[0] => 5
[1] => 4
[2] => 3
[3] => 2
[4] => 1
)
这不是你所期望的,我们已经从牌组中删除了9张牌,而不是一张
你得到的警告是,在发了几张牌后,你的牌组是空的。
您可以通过在处理每张卡后打印出$this->arrCards
的计数来轻松验证这一点,而不是依赖$this->intCount
,该计数在处理卡后不会更新。我可能会更改dealCard()
和hasCard()
方法:
public function dealCard()
{
$result = null;
if ($this->hasCard()) {
$index = array_rand($this->arrCards, 1);
$card = array_splice($this->arrCards, $index, 1);
$result = $card[0];
}
return $result;
}
public function hasCard()
{
$result = (!empty($this->arrCard));
return $result;
}
什么和为什么:
- 我喜欢将
$result
用于方法/函数-您总是知道$result
是您希望返回的
- 初始化
$result
-如果代码的行为与预期不符
你总会得到一些回报的
- 使用带有长度参数的函数-您只需要一张牌组中的牌
- 方法的1个退出点-这是一个简单的方法,但是具有多个退出点(
返回点
)的更复杂的方法以后可能很难调试
- 使用功能检查是否有更多的卡-使用/维护卡组中的卡计数器可以节省时间
我可能会更改dealCard()
和hasCard()
方法:
public function dealCard()
{
$result = null;
if ($this->hasCard()) {
$index = array_rand($this->arrCards, 1);
$card = array_splice($this->arrCards, $index, 1);
$result = $card[0];
}
return $result;
}
public function hasCard()
{
$result = (!empty($this->arrCard));
return $result;
}
什么和为什么:
- 我喜欢将
$result
用于方法/函数-您总是知道$result
是您希望返回的
- 初始化
$result
-如果代码的行为与预期不符
你总会得到一些回报的
- 使用带有长度参数的函数-您只需要一张牌组中的牌
- 方法的1个退出点-这是一个简单的方法,但是具有多个退出点(
返回点
)的更复杂的方法以后可能很难调试
- 使用功能检查是否有更多的卡-使用/维护卡组中的卡计数器可以节省时间
你能用几句话解释一下前提是什么吗?你是从52张牌组中发固定数量的牌吗?你在每次抽签前洗牌吗?这会有很大帮助:)@Alex Andrei不,我不需要洗牌,因为这相当于array_rand()所做的(一次只洗牌一次)。我在用一副标准牌发一组牌。我最初使用shuffle()将其洗牌,然后弹出一张牌,但我认为(除了“以防万一”之外,没有任何理由)在内存中(尽管是在服务器上)有洗牌牌牌组,黑客可以在发牌之前访问牌的顺序,洗牌1次,你想发X张牌,将它们从牌堆中移除,对吗?基本上。除非他们一次都没有被洗牌。每次通过array\u rand()函数抽卡时,它们基本上都会被洗牌。问题在于您使用array\u rand
和array\u splice
。您没有移除实际已发的卡。我会简短地解释,你能用几句话解释一下前提是什么吗?你在52张牌组中发固定数量的牌吗。。每次平局前你都洗牌吗。。这会有很大帮助:)@Alex Andrei不,我不需要洗牌,因为这相当于array_rand()所做的(一次只洗牌一次)。我在用一副标准牌发一组牌。我最初使用shuffle()将其洗牌,然后弹出一张牌,但我认为(除了“以防万一”之外,没有任何理由)在内存中(尽管是在服务器上)有洗牌牌牌组,黑客可以在发牌之前访问牌的顺序,洗牌1次,你想发X张牌,将它们从牌堆中移除,对吗?基本上。除非他们一次都没有被洗牌。每次通过array\u rand()函数抽卡时,它们基本上都会被洗牌。问题在于您使用array\u rand
和array\u splice
。您没有移除实际已发的卡。我将用简短的荔枝语来解释这一点@Alex Andrei。愚蠢的错误。忘了添加1作为splice()函数的第三个参数。为此@Alex Andrei干杯。