質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    24451questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • 配列

    627questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • セッション

    105questions

    Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

セッションの配列を上書きしてくれない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,545

sato165

score 5

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

session_start();

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


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

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 ) )
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tanat

    2015/12/21 17:49

    恐らく省略されているだけかと思いますが sesson_start(); が無いとそもそもセッションが動作しません。ソースコードを省略せずに全て記述してみて下さい。

    キャンセル

  • sato165

    2015/12/21 18:24

    ご意見ありがとうございました。
    前後のコードを追加しましたm(_ _)m

    キャンセル

回答 2

checkベストアンサー

+1

[key]が$itemの
[key] => 1450669337
等のことを指しているとすると配列のインデックスになっている訳では無いので、

$key = in_array($_SESSION['item'][ $_POST['key'] ]);


では判定出来ませんね。

var_dump($_SESSION)


として、$_SESSIONの構造を確認してみて下さい。

現在の構造のまま、判定するとしたら、

sort($_SESSION['item']);
    //$key = in_array($_SESSION['item'][ $_POST['key'] ]);
    foreach($_SESSION['item'] as $session_item_key => $session_item_val){
        if($val['key'] == $_POST['key'] )){
            $key = true;
            $item_index = $session_item_key;
            break;
        }
}
    }

//セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理
//↑コメントが「無かった場合の処理」とありますが、実際にはあった場合の処理を書きたそう
    if ($key) {
        if (isset($_SESSION['item'][$item_index]['type'])) {
            $_SESSION['item'][$item_index]['type'] = $_POST['type'];

            if (isset($_SESSION['item'][$item_index]['days'])) {
                $_SESSION['item'][$item_index]['days'] = $_POST['days'];

            }
        }


という感じでしょうか。

私が書くのであれば、itemを登録する時に

$_SESSION['item'][$item['key']] = $item;


として、判定するタイミングで

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


とすると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/21 19:30

    配列にインデックスを付けるやり方、スッキリしていていいですね。
    教えていただきたいのですが、$itemに渡して値を利用するときに20151225[sasak]という文字列で表示されてすまうのですが、こちらはどのように処理すればよろしいのでしょうか

    キャンセル

  • 2015/12/21 20:05

    > $itemに渡して値を利用するときに20151225[sasak]という文字列で表示されてすまうのですが
    「値を利用する時」のソースはどんな感じでしょうか?
    それとは関係無いかもしれませんが、古いセッションが残ってると大変なので、
    <?php
    session_start();
    $_SESSION = array();
    var_dump($_SESSION);

    とだけあるようなスクリプトを別途用意して、そのスクリプトにアクセスしたらセッションがクリアされるような仕組みを用意すると便利ですね。

    キャンセル

  • 2016/01/04 01:24

    お返事が遅くなって申し訳ございませんでした。
    SESSIONの構造から修正するには箇所が多すぎましたので、こちらのやり方を参考にさせていただき、思った通りの実装ができました。
    ありがとうございました!

    キャンセル

+1

$_POST['key'] を配列の添え字にしてはいかがでしょうか。

session_start();

$items = array();
if (isset($_SESSION['item'])) {
    $items = $_SESSION['item'];
}

if (isset($_POST['key']) && $_POST['key'] != '') {

    $key = $_POST['key'];

    //セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理
    if (in_array($key, array_keys($items))) {
        $items[$key]['type'] = $_POST['type'];
        $items[$key]['days'] = $_POST['days'];
    } else {
        if (isset($_POST['type']) && $_POST['type'] != ''
            && isset($_POST['day']) && $_POST['day'] != ''
            && isset($_POST['price']) && $_POST['price'] != ''
            && isset($_POST['days']) && $_POST['days'] != '') {
            //送られてきたデータを配列に格納
            $items[$key] = array(
                'type'  => $_POST['type'],
                'day'   => $_POST['day'],
                'price' => $_POST['price'],
                'days'  => $_POST['days']
            );
        } else {
            echo 'no item';   //何もカートに入っていません
        }
    }
    //セッション変数「item」に配列の中身を設定
    if (!empty($items)) {
        $_SESSION['item'] = $items;
    }

}


こんな感じになると思います。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/21 19:28

    ありがとうございます。
    こちらの参照渡しでの書き方勉強になりました。
    しかし、実際のコードにすると読み込むたびに空のarray()が増えてしまいます…
    もう少し頑張ってみます。

    キャンセル

  • 2015/12/21 21:36

    > こちらの参照渡しでの書き方勉強になりました。
    いえ。参照渡しではなく値渡しです。
    > しかし、実際のコードにすると読み込むたびに空のarray()が増えてしまいます…
    [1450669517] => Array ( [type] => [dayset] => [price] => [days] => )

    [] => Array ( [type] => [dayset] => [price] => [days] => )
    のような値が増えていくということでしょうか?

    コードを修正しましたが、こちらではどうでしょうか。

    キャンセル

  • 2015/12/22 01:00

    ありがとうございます。コード書いてみましたが
    1つ目は上手く行きました。配列も上記のとおりになります。
    しかし次の値から$_POST[key]が取得できなくなり、
    Array ( [1] => Array... となってしまいます。

    $key = $_POST['key'];
    だと、複数の値のkeyが変わってしまうようです。

    キャンセル

同じタグがついた質問を見る

  • PHP

    24451questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • 配列

    627questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • セッション

    105questions

    Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。