2017-08-04 18 views
0

私は通常のデッキから10枚のランダムなカードを出すプログラムを持っています。
時々私はシェルでスクリプトを実行すると、私は次のエラーメッセージ受け取る:次のようにphp - 「未定義のオフセット」エラーメッセージが表示されていますが、その理由はわかりません。

PHP Notice: Undefined offset: ..... on line 15

を私のコードが見えます:

<?php 
    $deck = array(
     array('A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'), //club 
     array('A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'), //spade 
     array('A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'), //heart 
     array('A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K') //diamond 
); 

    $i = 0; 
    for ($i = 1; $i <= 10; $i++) { 
     $a = rand(0, 3);  //card's suit 
     $nr = count($deck[$a]); //how many cards of the suit are available? 
     $b = rand(0, $nr--); //pick a random number out of the available ones 
     $card = $deck[$a][$b]; //pick a card [---LINE 15---] 

     switch ($a) { 
      case 0: 
       $c = "club"; 
       break; 
      case 1: 
       $c = "spade"; 
       break; 
      case 2: 
       $c = "heart"; 
       break; 
      case 3: 
       $c = "diamond"; 
       break; 
     } 

     echo $c . " " . $card . "\n" . "remaining: " . $nr . "\n"; 

     unset($deck[$a][$b]); //remove the card you drew 
     array_values($deck[$a]); //rearrange the index of the suit you drew the card from 
    } 
?> 

誰かが初心者を助けてもらえますか?

+1

$ aと$ bを出力して、何が返ってきているかを確認してください。デッキがそのインデックスを持っているかどうかを調べようとしてください。 – Exprator

+0

あなたは 'unset() 'カードなので、探してみてください。それらはもはや配列に存在しません。あなたのスクリプトは恐らく重複カードを与えようとします。 – BlitZ

+2

'$ nr - 'はrand関数の呼び出し後にのみ減少し、 ' - $ nr'または' $ nr-1'を使用する必要があります – xander

答えて

2

あなたは$foo --はポストデクリメントであるためです$b = rand(0, --$nr);

$b = rand(0, $nr--);を交換する必要があります。varが使用された後に値が減少します。 $deck[$a] = array_values($deck[$a]);

Pre/post increment and decrement

ここでプリ/ポストインクリメントとデクリメントの詳細情報:http://php.net/manual/en/language.operators.increment.php

+0

@ user3187119 'array_values($ deck [$ a] ); ' –

+0

甘い、両方の命題がうまくいった!ありがとうございます:) – user3187119

0

また、最後の行に、あなたはこれを行う必要がありarray_value()の結果を使用していません$デッキの位置配列を設定しないと、その同じ位置にアクセスしようとすると、そのオフセットが存在しなくなるため、未定義のオフセットエラーが発生します。

+0

これは私がarray_values($ deck [$ a])を使用するものです。 – user3187119

+0

これはループの終わりに関数 'array_values()'が呼び出された理由です。配列と同じ値を含み、パラメータとして渡されますが、キーが何であっても連続した数値インデックスを持ちます。それはあなたが物事を設定していないアレイをきれいにするのに最適です。 – ksjohn

0

最初に、というエラーが表示されてくれてありがとうございます。実際に感謝したコードにその行が含まれています。

count($deck[$a])は、現在その配列に含まれているエントリの数を返します。配列の最初のインデックスは0あるので例として、あなたのための初めに、それは王のインデックスはなり、13を返します12.たびに、あなたのコードがカードを選択しようとすることを意味し

$nrのうち、使用されるオフセットが存在しない可能性があります。

$nr = count($deck[$a]) - 1; 配列の先頭から1を削除すると、$nrは正しい値に設定されます。その値を割り当てるその方法は、あなたの問題を修正し、また次の行でそれをデクリメントの必要性を削除する必要があります。

$nr = count($deck[$a]) - 1; 
$b = rand(0, $nr); 
0

これはあなたのエラーを排除します:

コード:(Demo

$ranks=['A',2,3,4,5,6,7,8,9,10,'J','Q','K']; 
$suits=['club','spade','heart','diamond']; // store suit names, avoid switch-case 
foreach($suits as $suit){ 
    shuffle($ranks); // shuffle once, avoid future rand() on subarray 
    $deck[]=$ranks; // store shuffled suit cards 
} 
for($x=0; $x<10; ++$x){ 
    $i=rand(0,3); // pick random suit/subarray key 
    echo $suits[$i],' ',array_pop($deck[$i]),' remaining ',sizeof($deck[$i]),"\n"; 
} 

これはあなたの仕事を終えるだけでなく、余分な関数呼び出しを削減します。

p.s.私はカードが好きです。

関連する問題