5716
失礼します。  
セッションを利用したカートシステムを作っているのですが、今の状態では同じ商品がいくつも重複して追加されてしまいます。  
これを解決するためにin_array関数などをいろいろと試してみたのですが、自分の力ではどれも上手く動いてくれなかったのでこちらで質問させていただきます。

以下がコードです。

```

    //セッション変数「cart」が未設定の場合は空の配列に初期化
    if(!isset($_SESSION['cart'])){
        $_SESSION['cart'] = array();
    }else if (is_string($_SESSION['cart'])){    
    //セッション変数「cart」に文字列が存在していれば配列セッションcartを代入 
    $_SESSION['cart'] = array($_SESSION['cart']); 
    }
    
        /********************追加処理**********************/    
    //セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理
    $key = in_array($_POST['id'], $_SESSION['cart']);
    
    if(!$key){
        if(isset($_POST['price'])){
            $price = $_POST['price'];
    
            if(isset($_POST['num'])){
                $num = $_POST['num'];
               $sum = $price * $num;
            }
        }
        //item_resultからpostでid,name,priceが送られてきたかを確認
        if(isset($_POST['id'])){
        if(isset($_POST['name'])){
        if(isset($_POST['price'])){
        if(isset($_POST['num'])){
        if(isset($sum)){
        //送られてきたデータを配列に格納
        $item = array('id' => $_POST['id'],
                        'name' => $_POST['name'],
                        'price' => $_POST['price'],
                        'num' => $_POST['num'],
                        'sum' => $sum);
        }}}}
        }else{
            $msg = 'no item';   //何もカートに入れてませんよー
        }
    
        //セッション変数「cart」に配列の中身を追加
        if(isset($item)){
            $_SESSION['cart'][] = $item;
        }
    }
    
    //表示するためにセッションの中身を配列に入れなおす
    $print_cart = $_SESSION['cart'];
    /*************************************************/
    
```

カートに追加する動きに関する処理のみになります。

目的はカート内に重複したデータが存在しない事ですので、  
1.POSTで送られてきたデータが既に存在している場合、カート内の商品の個数をプラス1する  
2.カートに入れた後、重複したデータが存在していたら1つのみを残して個数をプラス1する  
この2点のどちらの方法でも問題ありません。

どちらも自分で試した結果、上手くいきませんでした。  
どう記述したら良いでしょうか？  
よろしくお願いします。

コメントを頂きましたので、コードを修正しました。  
重複チェックをしていた時のコードになります。
CC BY-SA 3.0
2015-02-02T01:07:29.680
5715
2015-02-02T01:40:47.833
2015-02-02T01:39:33.750
5985
5985
question
php
セッション変数内の配列にデータを重複させない処理をしたい。
現状だと$_SESSION['cart']は単なる配列になっているのでin_arrayを使っても重複チェックが効きません。そこで、IDを使った連想配列（hash）にすると動くはずです。

```

    //セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理 
    $key = isset($_SESSION['cart'][$_POST['id']]);
    
    // …色々処理…
    
    //セッション変数「cart」に配列の中身を追加 
    if(isset($item)) {
        $_SESSION['cart'][$_POST['id']] = $item; 
    }
    
```

$_POSTや$_SESSION変数を直接使うと、コードが読みにくくなってバグを探すのが難しくなってしまいます。関数を使って、$_POSTや$_SESSION['cart']を渡して上げると読みやすくなると思います。
CC BY-SA 3.0
2015-02-02T01:40:47.833
5716
2015-02-02T01:40:47.833
2571
5715
answer