セッション配列が上書きできない


POSTした値をセッションに追加して配列にしています。  
POSTした値と同じ[key]があったときは上書きしたいのですが、何度やってもうまく行きません。  
どのようにしたら上書きするでしょうか。

[code]

    session_start();
    
    //セッション変数「item」が未設定の場合は空の配列に初期化
    if (!isset($_SESSION['item'])) {
        $_SESSION['item'][] = array();
    } else if (is_string($_SESSION['item'])) {
        //セッション変数「cart」に文字列が存在していれば配列セッションcartを代入
        $_SESSION['item'][] = array($_SESSION['item']);
    }
    sort($_SESSION['item']);
    
    /********************追加処理**********************/
    
    $key = isset($_SESSION['item'][ $_POST['key'] ]);
    
    //セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理
        if ($key) {
            if (isset($_SESSION['item']['type'])) {
                $_SESSION['item']['type'] = $_POST['type'];
    
                if (isset($_SESSION['item']['days'])) {
                    $_SESSION['item']['days'] = $_POST['days'];
    
                }
            }
        }else{
            if (isset($_POST['key'])) {
                if (isset($_POST['type'])) {
                    if (isset($_POST['day'])) {
                        if (isset($_POST['price'])) {
                            if (isset($_POST['days'])) {
                                //送られてきたデータを配列に格納
                                $item = array('key'    => $_POST['key'],
                                              'type'   => $_POST['type'],
                                              'day' => $_POST['day'],
                                              'price'  => $_POST['price'],
                                              'days'     => $_POST['days']);
                            }
                        }
                    }
                }
            } else {
                echo = 'no item';   //何もカートに入っていません
            }
        }
    //セッション変数「item」に配列の中身を追加
    if (isset($item)) {
        $_SESSION['item'][] = $item;
    };
    
    $item = $_SESSION['item'];
    $item = array_filter($item);
    
[/code]

セッションは配列にして受渡ししています。  
$item = $_SESSION['item']

[code]

    Array ( 
    [1] => Array ( [key] => 1450669337 [type] => 4 [dayset] => 20151225 [price]=> 1,000 [days] => 1 )
    [2] => Array ( [key] => 1450669517 [type] => 6 [dayset] => 20151231 [price] => 3,000 [days] => 3 ) )
    
[/code]



[code]

    $_SESSION = array(
        'item' => array(
            array('key' => 1450669337, 'type' => 4, 'dayset' => 20151225, ...),
            array('key' => 1450669317, 'type' => 6, 'dayset' => 20151231, ...),
            ...
        )
    );
    
[/code]

という構造を期待されていて、上記 `key` が `$_POST['key']` に対応するものとして回答します。

まず、

[code]

    $key = isset($_SESSION['item'][ $_POST['key'] ]); //NG
    
[/code]

前述の構造において `145069337` は配列の **値** ですから、 `$_SESSION['item']['145069337']`
といった形でアクセスすることはできず、順番に `key === 145069337` となる要素を探す必要があります。

[code]

        if (isset($_SESSION['item']['type'])) { //NG
            $_SESSION['item']['type'] = $_POST['type']; //NG
    
[/code]

ここでは item の直下に type があるものとして書かれていますが、正しくは、 item の中の **n番目の要素の中に** type
が存在する、という構造ですよね？

それを踏まえて、現状の構造を維持する場合は次のようになるでしょう。

[code]

    $found = false; //見つかったかどうか
    
    foreach ($_SESSION['item'] as $index => $item) {
        if ($item['key'] === $_POST['key']) {
            // とりあえず$itemだけ更新して、
            $item['type'] = $_POST['type'];
            $item['days'] = $_POST['days'];
            // $_SESSIONに書き戻す
            $_SESSION['item'][$index] = $item;
            // 見つけたというフラグを立ててループを抜ける
            $found = true;
            break;
        }
    }
    
    if(!$found) {
        // 見つからなかったので追加する
        $_SESSION['item'][] = ...;
    }
    
[/code]

もしくは、`$_SESSION['item'][] = $item` の代わりに `$_SESSION['item'][$item['key']] =
$item` として、key を配列のキーにしてしまえば、検索する必要はなくなります。

この場合の `$_SESSION` は以下のような構造になります。実装例は省略。

[code]

    $_SESSION = array(
        'item' => array(
            1450669337 => array('key' => 1450669337, 'type' => 4, 'dayset' => 20151225, ...),
            1450669317 => array('key' => 1450669317, 'type' => 6, 'dayset' => 20151231, ...),
            ...
        )
    );
    
[/code]



[code]

    $_SESSION = array(
        'item' => array(
            array('key' => 1450669337, 'type' => 4, 'dayset' => 20151225, ...),
            array('key' => 1450669317, 'type' => 6, 'dayset' => 20151231, ...),
            ...
        )
    );
    
[/code]

という構造を期待されていて、上記 `key` が `$_POST['key']` に対応するものとして回答します。

まず、

[code]

    $key = isset($_SESSION['item'][ $_POST['key'] ]); //NG
    
[/code]

前述の構造において `145069337` は配列の **値** ですから、 `$_SESSION['item']['145069337']`
といった形でアクセスすることはできず、順番に `key === 145069337` となる要素を探す必要があります。

[code]

        if (isset($_SESSION['item']['type'])) { //NG
            $_SESSION['item']['type'] = $_POST['type']; //NG
    
[/code]

ここでは item の直下に type があるものとして書かれていますが、正しくは、 item の中の **n番目の要素の中に** type
が存在する、という構造ですよね？

それを踏まえて、現状の構造を維持する場合は次のようになるでしょう。

[code]

    $found = false; //見つかったかどうか
    
    foreach ($_SESSION['item'] as $index => $item) {
        if ($item['key'] === $_POST['key']) {
            // とりあえず$itemだけ更新して、
            $item['type'] = $_POST['type'];
            $item['days'] = $_POST['days'];
            // $_SESSIONに書き戻す
            $_SESSION['item'][$index] = $item;
            // 見つけたというフラグを立ててループを抜ける
            $found = true;
            break;
        }
    }
    
    if(!$found) {
        // 見つからなかったので追加する
        $_SESSION['item'][] = ...;
    }
    
[/code]

もしくは、`$_SESSION['item'][] = $item` の代わりに `$_SESSION['item'][$item['key']] =
$item` として、key を配列のキーにしてしまえば、検索する必要はなくなります。

この場合の `$_SESSION` は以下のような構造になります。実装例は省略。

[code]

    $_SESSION = array(
        'item' => array(
            1450669337 => array('key' => 1450669337, 'type' => 4, 'dayset' => 20151225, ...),
            1450669317 => array('key' => 1450669317, 'type' => 6, 'dayset' => 20151231, ...),
            ...
        )
    );
    
[/code]

