在PHP和I';我得到一个超出范围的错误

在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

我对PHP完全是新手,我的代码中有一个逻辑问题(我认为array_rand($arrCards,1)在应该使用的元素之前就用完了)。因此,我对数组进行了var_转储,得到了以下输出(简要摘录):

这是我的卡片分类:

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干杯。