セッション変数内の配列にPOSTで送られたデータが既に存在する場合に配列の特定の要素の値を変更する方法

投稿者: Anonymous

失礼します。
PHPでセッションを利用したショッピングカートのシステムを作っているのです。

現在、カート内に商品の重複をさせない処理まではできているのですが、カート内に同じIDの商品が存在する時には既にカート内に入っている商品の個数を追加する変更処理を行えるようにしたいです。

例)カート内  :ID1 りんご 個数1
     ↓
  ユーザの行動:追加でりんごを2つカートに入れる
     ↓
  カート内  :ID1 りんご 個数3

このような状態になるように処理をしたいです。
伝わっているでしょうか。

コードは以下の通りです。

//セッション変数「cart」が未設定の場合は空の配列に初期化
if(!isset($_SESSION['cart'])){
    $_SESSION['cart'] = array();
}else if (is_string($_SESSION['cart'])){    
    //セッション変数「cart」に文字列が存在していれば配列セッションcartを代入 
    $_SESSION['cart'] = array($_SESSION['cart']); 
}

/********************追加処理**********************/    

$key = isset($_SESSION['cart'][$_POST['id']]);

//セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理
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'][$_POST['id']] = $item;
}

//表示するためにセッションの中身を配列に入れなおす
$print_cart = $_SESSION['cart'];

foreachで$print_cartを回しながら、POSTで送られたIDと配列内のIDが一致した場合にarray_spliceで置換したらどうかと考えたのですが書き方が分からず断念してしまいました。

やりたい事は、カート内に同じIDの処理が存在する時には既にカート内に入っている商品の個数を追加する変更処理です。

どうしたらよいのでしょうか?
よろしくお願いします。

解決

ちょっとロジックが複雑だったので整理しました。
これ単体でphpファイルとして動きます。

<?php
session_start();
if(!isset($_SESSION['cart'])){
    $_SESSION['cart'] = array();
}
if(isset($_POST['id'])){
    $num = $_POST['num'];
    if(isset($_SESSION['cart'][$_POST['id']])){
        $num += $_SESSION['cart'][$_POST['id']]['num'];
    }
    $_SESSION['cart'][$_POST['id']] = array(
        'id' => $_POST['id'],
        'name' => $_POST['name'],
        'price' => $_POST['price'],
        'num' => $num,
        'sum' => $_POST['price'] * $num
    );
    $print_cart = $_SESSION['cart'][$_POST['id']];
}else{
    $print_cart = array('id' => '', 'name' => '', 'price' => '', 'num' => 0, 'sum' => 0);
    $msg = 'no item';
}
?>
テスト用フォーム
<meta charset="utf-8">
<form method="post">
    ID <input name="id" value="<?php echo $print_cart['id'] ?>"><br>
    名前 <input name="name" value="<?php echo $print_cart['name'] ?>"><br>
    価格 <input name="price" value="<?php echo $print_cart['price'] ?>"><br>
    数量 <?php echo $print_cart['num'] ?><br>
    追加数量 <input name="num" value="0"><br>
    合計  <?php echo $print_cart['sum'] ?><br>
    <input type="submit">
</form>

追加数量を入れてポストするごとに個数が足されます。
参考になれば幸いです。
セキュリティの処理は入れていないので気をつけてください。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *