

度々質問すみません。早急に教えて頂ければ幸いです。  
二人のプレイヤーがカードを以下の通り引いた時、同じカードが重複して表示される現象を回避する方法をご教示頂けますでしょうか。

[code]

    public function createCards()
    {
        //変数の初期化
        $newCard = array();
        $marks = array(
            "clubs",
            "hearts",
            "diams",   
            "spades",
        );
        //山札を作成
        $card = array();
        for($mark = 0; $mark < 4; $mark++) {
            for($num = 1; $num <= 13; $num++) {    
                $newCard["mark"] = $marks[$mark];
                $newCard["number"] = $num;
                array_push($card,$newCard);
            }
        }
        return $card;
    }
    
    /**
     * 手札の作成
     * @param Array $tehuda_player1, $tehuda_player2
     * @return string
     */
    public function shuffleCards($card)
    {
        //山札をランダムに取り出す
        shuffle($card); 
        //各プレイヤー山札から5枚引く
        $tehuda_player1[] = array();
        $tehuda_player2[] = array();
        for($i = 0; $i < 5; $i++) {
            $tehuda_player1[] = array_pop($card);
        }
        for($i = 0;$i < 5; $i++){
            $tehuda_player2[] = array_pop($card);
        }
        return $tehuda_player1;
        return $tehuda_player2;
    }
    
    /**
     * 手札の表示
     * 
     */ 
    public function showCards($tehuda_player1,$tehuda_player2)
    {
        //トランプの画像を用意する
        foreach($tehuda_player1 as $tmp) {
            $mark = $tmp["mark"];
            $number = $tmp["number"];
            echo '<img src="image/gif/'.$mark."_".$number.'.gif" alt = "">';
        }
    }
    
[/code]

理想としては、$tehuda_player1の処理が終わった後には$tehuda_player1が引いた分のカードが配列から無くなる事なのですが、$card-$tehuda_player1と書くと何も表示されなくなります。

原因わかる方、教えていただけたら幸いです。

* * *

コメントより、関数の使用想定を記載します。

[code]

    $card = $trump->createCards(); //カード52枚 
    $tehuda_player1 = $trump->shuffleCards($card); 
    $tehuda_player2 = $trump->shuffleCards($card); 
    $player1 = $trump->showCards($tehuda_player1); 
    $player2 = $trump->showCards($tehuda_player2); 
    echo "<div class='player1_cards'>".$player1."</div>"; 
    echo "<div class='player2_cards'>".$player2."</div>"; 
    
[/code]


CC BY-SA 3.0
2016-07-25T07:16:27.297
27841
2016-07-29T00:51:15.763
2016-07-25T08:04:37.937
14914
question
php array
配列から重複取り出しを防ぐ


しばらくPHP触ってなかったので誤字あるかもですが、適当に使ってみました。  
使っている想定が分からないので既出の関数はいじっていませんが、  
先ほどのコメントで言った返却部分のみいじってまとめてます。  
クラス名も何つけてるのかわからないので適当に`fooClass`です。  
最後の出力関数でPlayer1しか表示していないのが気になりますが……適度にいじって下さい。  
**追記**  
おかしな箇所もう1つありました。  
`shuffleCards`内で配列を初期化している際に  
`$val[] = array()`になっていますが、間違いです。  
`$val = array()`です。`$val[]`は **既に配列の変数の末尾** に追加します。

[code]

    public function createCards()
    {
        //変数の初期化
        $newCard = array();
        $marks = array(
            "clubs",
            "hearts",
            "diams",   
            "spades",
        );
        //山札を作成
        $card = array();
        for($mark = 0; $mark < 4; $mark++) {
            for($num = 1; $num <= 13; $num++) {    
                $newCard["mark"] = $marks[$mark];
                $newCard["number"] = $num;
                array_push($card,$newCard);
            }
        }
        return $card;
    }
    
    /**
     * 手札の作成
     * @param Array $tehuda_player1, $tehuda_player2
     * @return array
     */
    public function shuffleCards($card)
    {
        //山札をランダムに取り出す
        shuffle($card); 
        //各プレイヤー山札から5枚引く
        $tehuda_player1 = array();
        $tehuda_player2 = array();
        for($i = 0; $i < 5; $i++) {
            $tehuda_player1[] = array_pop($card);
        }
        for($i = 0;$i < 5; $i++){
            $tehuda_player2[] = array_pop($card);
        }
        return array($tehuda_player1,$tehuda_player2);
    }
    
    /**
     * 手札の表示
     * 
     */ 
    public function showCards($tehuda_player1,$tehuda_player2)
    {
        //トランプの画像を用意する
        foreach($tehuda_player1 as $tmp) {
            $mark = $tmp["mark"];
            $number = $tmp["number"];
            echo '<img src="image/gif/'.$mark."_".$number.'.gif" alt = "">';
        }
    }
    
    /**
     * 使用用途が分からないので使ってみる
     */
    public function initialize(){
        $baseCards = $this->createCards();
        $playerCards = $this->shuffleCards($baseCards);
        $this->showCards($playerCards[0],$playerCards[1]);
    }
    
    $clsObj = new fooClass();
    $clsObj->initialize();
    
[/code]

* * *

**質問文追記により、更に追記**  
関数内で`echo`していますが、`echo`は即時に出力されるので、  
現在のままですとカードのイメージが出力された後に`div`画出力されます。  
※上記の修正済みの関数での実行を想定するように修正しました。

[code]

    $card = $trump->createCards(); //カード52枚 
    $tehuda_players = $trump->shuffleCards($card);
    //player1出力
    echo "<div class='player1_cards'>";
    $trump->showCards($tehuda_players[0]); 
    echo "</div>"; 
    //player2出力
    echo "<div class='player2_cards'>"; 
    $trump->showCards($tehuda_players[1]); 
    echo "</div>"; 
    
[/code]

* * *

**追記**  
試験用にコード全文を再記します。  
私の上記の回答をほとんどそのままですが、  
下記のコードをコピペして重複しますか？  
(`showCards`の引数を1つにし、出力が分かりやすいように改行を入れています。)

[code]

    <?php
    Class fooClass{
        public function createCards()
        {
            //変数の初期化
            $newCard = array();
            $marks = array(
                "clubs",
                "hearts",
                "diams",   
                "spades",
            );
            //山札を作成
            $card = array();
            for($mark = 0; $mark < 4; $mark++) {
                for($num = 1; $num <= 13; $num++) {    
                    $newCard["mark"] = $marks[$mark];
                    $newCard["number"] = $num;
                    array_push($card,$newCard);
                }
            }
            return $card;
        }
    
        /**
         * 手札の作成
         * @param Array $tehuda_player1, $tehuda_player2
         * @return array
         */
        public function shuffleCards($card)
        {
            //山札をランダムに取り出す
            shuffle($card); 
            //各プレイヤー山札から5枚引く
            $tehuda_player1 = array();
            $tehuda_player2 = array();
            for($i = 0; $i < 5; $i++) {
                $tehuda_player1[] = array_pop($card);
            }
            for($i = 0;$i < 5; $i++){
                $tehuda_player2[] = array_pop($card);
            }
            return array($tehuda_player1,$tehuda_player2);
        }
    
        /**
         * 手札の表示
         * 
         */ 
        public function showCards($tehuda_player)
        {
            //トランプの画像を用意する
            foreach($tehuda_player as $tmp) {
                $mark = $tmp["mark"];
                $number = $tmp["number"];
                echo '<img src="image/gif/'.$mark."_".$number.'.gif" alt = "">'."\n";
            }
        }
    }
    
    $trump= new fooClass();
    $card = $trump->createCards(); //カード52枚 
    $tehuda_players = $trump->shuffleCards($card);
    //player1出力
    echo "<div class='player1_cards'>\n";
    $trump->showCards($tehuda_players[0]); 
    echo "</div>\n\n"; 
    //player2出力
    echo "<div class='player2_cards'>\n"; 
    $trump->showCards($tehuda_players[1]); 
    echo "</div>"; 
    ?>
    
[/code]


CC BY-SA 3.0
2016-07-25T07:45:48.937
27843
2016-07-29T00:51:15.763
2016-07-29T00:51:15.763
27841
answer