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

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

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

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

セッション

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

配列

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

Q&A

解決済

2回答

6995閲覧

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

sato165

総合スコア13

PHP

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

セッション

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

配列

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

0グッド

1クリップ

投稿2015/12/21 08:35

編集2015/12/21 09:01

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

PHP

1 session_start(); 2 3 //セッション変数「cart」が未設定の場合は空の配列に初期化 4 if (!isset($_SESSION['item'])) { 5 $_SESSION['item'][] = array(); 6 } else if (is_string($_SESSION['item'])) { 7 //セッション変数「item」に文字列が存在していれば配列セッションitemを代入 8 $_SESSION['item'][] = array($_SESSION['item']); 9 } 10 sort($_SESSION['item']); 11 $key = in_array($_SESSION['item'][ $_POST['key'] ]); 12 13//セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理 14 if ($key) { 15 if (isset($_SESSION['item']['type'])) { 16 $_SESSION['item']['type'] = $_POST['type']; 17 18 if (isset($_SESSION['item']['days'])) { 19 $_SESSION['item']['days'] = $_POST['days']; 20 21 } 22 } 23 }else{ 24 if (isset($_POST['key'])) { 25 if (isset($_POST['type'])) { 26 if (isset($_POST['day'])) { 27 if (isset($_POST['price'])) { 28 if (isset($_POST['days'])) { 29 //送られてきたデータを配列に格納 30 $item = array('key' => $_POST['key'], 31 'type' => $_POST['type'], 32 'day' => $_POST['day'], 33 'price' => $_POST['price'], 34 'days' => $_POST['days']); 35 } 36 } 37 } 38 } 39 } else { 40 echo = 'no item'; //何もカートに入っていません 41 } 42 } 43//セッション変数「item」に配列の中身を追加 44 if (isset($item)) { 45 $_SESSION['item'][] = $item; 46 }; 47 48 $item = $_SESSION['item']; 49 $item = array_filter($item);

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

PHP

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tanat

2015/12/21 08:49

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

2015/12/21 09:24

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

回答2

0

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

PHP

1session_start(); 2 3$items = array(); 4if (isset($_SESSION['item'])) { 5 $items = $_SESSION['item']; 6} 7 8if (isset($_POST['key']) && $_POST['key'] != '') { 9 10 $key = $_POST['key']; 11 12 //セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理 13 if (in_array($key, array_keys($items))) { 14 $items[$key]['type'] = $_POST['type']; 15 $items[$key]['days'] = $_POST['days']; 16 } else { 17 if (isset($_POST['type']) && $_POST['type'] != '' 18 && isset($_POST['day']) && $_POST['day'] != '' 19 && isset($_POST['price']) && $_POST['price'] != '' 20 && isset($_POST['days']) && $_POST['days'] != '') { 21 //送られてきたデータを配列に格納 22 $items[$key] = array( 23 'type' => $_POST['type'], 24 'day' => $_POST['day'], 25 'price' => $_POST['price'], 26 'days' => $_POST['days'] 27 ); 28 } else { 29 echo 'no item'; //何もカートに入っていません 30 } 31 } 32 //セッション変数「item」に配列の中身を設定 33 if (!empty($items)) { 34 $_SESSION['item'] = $items; 35 } 36 37}

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

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 09:37

編集2015/12/21 12:40
hyper-drums-ko

総合スコア736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sato165

2015/12/21 10:28

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

2015/12/21 12:36

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

2015/12/21 16:00

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

0

ベストアンサー

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

PHP

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

では判定出来ませんね。

PHP

1var_dump($_SESSION)

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

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

PHP

1 sort($_SESSION['item']); 2 //$key = in_array($_SESSION['item'][ $_POST['key'] ]); 3 foreach($_SESSION['item'] as $session_item_key => $session_item_val){ 4 if($val['key'] == $_POST['key'] )){ 5 $key = true; 6 $item_index = $session_item_key; 7 break; 8 } 9} 10 } 11 12//セッション変数内にPOSTで送られてきたidと同じものが無かった場合の処理 13//↑コメントが「無かった場合の処理」とありますが、実際にはあった場合の処理を書きたそう 14 if ($key) { 15 if (isset($_SESSION['item'][$item_index]['type'])) { 16 $_SESSION['item'][$item_index]['type'] = $_POST['type']; 17 18 if (isset($_SESSION['item'][$item_index]['days'])) { 19 $_SESSION['item'][$item_index]['days'] = $_POST['days']; 20 21 } 22 } 23

という感じでしょうか。

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

PHP

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

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

PHP

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

とすると思います。

投稿2015/12/21 09:35

tanat

総合スコア18711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sato165

2015/12/21 10:30

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

2015/12/21 11:05

> $itemに渡して値を利用するときに20151225[sasak]という文字列で表示されてすまうのですが 「値を利用する時」のソースはどんな感じでしょうか? それとは関係無いかもしれませんが、古いセッションが残ってると大変なので、 <?php session_start(); $_SESSION = array(); var_dump($_SESSION); とだけあるようなスクリプトを別途用意して、そのスクリプトにアクセスしたらセッションがクリアされるような仕組みを用意すると便利ですね。
sato165

2016/01/03 16:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問