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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

Q&A

解決済

3回答

2630閲覧

php配列の検索、追加、編集、削除について

shinoda

総合スコア75

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

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

0グッド

0クリップ

投稿2014/12/25 05:15

お世話になります。
現在jsonファイルの配列をphpでデコードしphpで配列の検索、追加、編集、削除をしjsonファイルにエンコードするといったプログラムを組んでいます。
何点か困っていることがありご教授いただければ幸いです。

1、多次元配列の中の特定のキーと要素の取得ができない
-------------------↓jsonコード---------------------

aaa:
{
bbb:[
{
"no":"1",
"id":"1",
"type":["name":"aaa","type":"a"];
}
]
}
}

この配列(オブジェクト)をphpに配列にしてデコードしてます
この中の[0][aaa][bbb][0]の[no]から下の部分をforeachなどでまとめて取ることはできますか?
今はひとつずつ echo $a["0"]["aaa"]["bbb"]["0"]["no"];
echo $a["0"]["aaa"]["bbb"]["0"]["id"];
のように書いています。

2,上記の配列に追加の仕方がわからない。
フォームの各項目をPOSTし$_SESSIONに格納して配列は受け取っているのですがその後どうやって追加したらいいですか?
各項目は上記の配列の[no]から下の部分になります。

長文なうえ説明不足があるとは思いますがご教授お願い致します。

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

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

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

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

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

guest

回答3

0

1に関しては

lang

1foreach ($a["0"]["aaa"]["bbb"]["0"] as $hoge) { 2 echo $hoge; 3}

でなんとかなりそうです。

2に関しては

配列は受け取っているのですがその後どうやって追加したらいいですか?

何に何を追加したいのでしょうか。

よろしくお願い致します。

投稿2014/12/25 05:32

m_kuwako

総合スコア136

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

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

shinoda

2014/12/25 07:06

早速のお答え有り難うございます。 2に関してなのですが上記の配列の --------------------------------------------------------------------------- ["0"]["aaa"]["bbb"]["0"][no] ["0"]["aaa"]["bbb"]["0"][id] ["0"]["aaa"]["bbb"]["0"][type][name] -------------------------------------------------------------------------- その後に ["0"]["aaa"]["bbb"]["1"][no] ["0"]["aaa"]["bbb"]["1"][id] ["0"]["aaa"]["bbb"]["1"][type][name] 上記を追加したいのですがうまくいきません 現在は ------------------------------------------------------------------------------------------- <form method="POST" action="sinnki_confirm.php"> <table id="name" border="1"> <tr> <th>no</th> <td> <input type="text" name="['no']" size="10" value=""></td> </tr> </table> </form> ------------------------------------------------------------------------------------------ これをセッションに格納してvar_dumpで確認したところ中身はとれていました。 また追加で質問になってしまうのですが["no"]の頭に["0"]["aaa"]["bbb"]このキーを追加するのはどうすればいいでしょうか? 拙い説明で申し訳ありませんがご教授宜しくお願い致します。
m_kuwako

2014/12/25 07:34

["0"]["aaa"]["bbb"]["1"]["no"] = ["no"]; してもダメですか?
shinoda

2014/12/25 08:13

どのタイミングで定義すればよいのでしょうか? 現在セッションに格納は下記のようにしています。 $_SESSION["no"] = ($_POST["['no']"]);
m_kuwako

2014/12/25 09:06

すみません、正直何をなさりたいのか分からないです。
shinoda

2014/12/25 10:07

すいません。 私自身の知識が乏しくうまく説明ができないのですが ---------------------------------1ページ目----------------------------------------------------- <form method="POST" action="sinnki_confirm.php"> <table id="name" border="1"> <tr> <th>no</th> <td> <input type="text" name="['no']" size="10" value=""></td> </tr> </table> </form> ------------------------------------------------------------------------------------------ -----------------------------------2ページ目---------------------------------------------- $_SESSION["no"] = ($_POST['no']"]); $no = htmlspecialchars($_SESSION["no"],ENT_QUOTES); ------------------------------------------------------------------------------------------ -----------------------------------↓すでにある配列--------------------------------------["0"]["aaa"]["bbb"]["0"][no] ["0"]["aaa"]["bbb"]["0"][id] ["0"]["aaa"]["bbb"]["0"][type][name] ["0"]["aaa"]["bbb"]["1"][no] ["0"]["aaa"]["bbb"]["1"][id] ["0"]["aaa"]["bbb"]["1"][type][name] ------------------------------------------------------------------------------------------ 1ページ、2ページ目とフォームで渡ってきた[no][id][type]をすでにある配列のしたに ["0"]["aaa"]["bbb"]["2"][no] ["0"]["aaa"]["bbb"]["2"][id] ["0"]["aaa"]["bbb"]["2"][type][name] という風に追加していきたいということです。 大雑把な流れで申しますと新規登録のフォームがあり入力された値を$_SESSIONの中に配列で入りその配列を既存の配列の後ろに追加していきたいということです。 新規と既存の配列は全く同じ構造にしたいと思っています。 うまく説明できていないとは存じますが何卒お願い致します。
guest

0

ベストアンサー

下記でどうでしょうか?
今手元に実行環境がないので、エラー吐くかもしれませんが。

lang

1foreach ($a["0"]["aaa"]["bbb"]["0"] as $key => $val) { 2 if (is_array($val)) { 3 foreach ($val as $k => $v) { 4 echo $v; 5 } 6 } else { 7 echo $val; 8 } 9}

lang

1$a["0"]["aaa"]["bbb"]["2"] = array ( 2 "no" => $no, // フォームで渡ってきたno 3 "id" => $id, // フォームで渡ってきたid 4 "type" => $type, // フォームで渡ってきたtype (配列) 5);

投稿2014/12/25 12:07

k.tada

総合スコア1679

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

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

shinoda

2014/12/26 02:17

お世話になります。 本日は別の仕事のため試せませんが週明けに試してみます。 ありがとうございます。
shinoda

2014/12/29 07:54

お世話になります。 本日試してみましたが Notice: Array to string conversion のエラーがでました。 $vをエコーはできているので$vの中身が配列になっているのでこのエラーが出ているのでしょうか? また2に関してなのですがフォームから渡ってきた変数を配列に格納するということは理解出来ましたがその出来た配列を既存の配列の最後に挿入するにはどうすればいいのでしょうか? 宜しくお願い致します。
k.tada

2014/12/29 08:21

$vをechoするとなんと表示されますか? 既存の配列が$a["0"]["aaa"]["bbb"]["0"]と$a["0"]["aaa"]["bbb"]["1"]に入っているんですよね?なので["2"]に追加すれば良いのではないでしょうか? 単純に末尾に追加したいのであれば、array_pushを使えばよいかと思いますが、その場合、既に配列に格納されているキーに関係なく数値0から順に追加されることになります。 例1:既に配列に格納されている配列のキーが文字列の場合 $a["0"]["aaa"]["bbb"]["0"]と$a["0"]["aaa"]["bbb"]["1"]が存在する場合は、array_pushするとキーは0(数値)で追加されることになるかと思います。 例2:既に配列に格納されている配列のキーが数値の場合 $a["0"]["aaa"]["bbb"][0]と$a["0"]["aaa"]["bbb"][1]が存在する場合は、array_pushするとキーは2(数値)で追加されることになるかと思います。 取り急ぎの回答のため誤り等ありましたら申し訳ございません。
shinoda

2015/01/05 11:09

明けましておめでとうございます。 正月休みのため試せませんでしたが 1の$vをechoする件についてですが ["0"]["aaa"]["bbb"]["0"]の後の"no":"1"の階層の値(1)はとれているのですがその下の階層は全てNotice: Array to string conversionのエラーがでました。 2の配列の追加の件はまだ試せていませんが結果が分かり次第報告させていただきます。 宜しくお願い致します。
shinoda

2015/01/06 08:14

お世話になります。 2の配列の追加の件なのですが ------------------------------------------------------------- $a["0"]["aaa"]["bbb"]["2"] = array ( "no" => $no, // フォームで渡ってきたno "id" => $id, // フォームで渡ってきたid "type" => $type, // フォームで渡ってきたtype (配列) ); -------------------------------------------- この$aをvar_dumpで確認したところnoはnullとなってしまい Notice: Undefined variable: no in というエラーがでました。 宜しくお願い致します。
k.tada

2015/01/06 08:28

すみません。よく分からないのですが、 ・フォームから渡ってきた$noがnullだったのでしょうか? ・$a["0"]["aaa"]["bbb"]["2"]にarrayを格納したあとで$aをvar_dumpしたのでしょうか? ・上述のコメントに記載したarray_pushではダメだったということでしょうか?
shinoda

2015/01/06 09:49

申し訳ございません 私のミスでした。仰るとおりの方法でうまくできました。 array_pushより空で追加したほうが早いみたいなのでそちらでうまくいきました。 1のキーと要素の取得に関してはうまくいかないのでとりあえずひとつずつ書き出しています。 これからも勉強してブラッシュアップしていきます。
guest

0

追記致します1番目なのですがご指摘どおりにしてみましたが[no]の階層の要素は取れたのですがその下の
[type]から先が取れませんでしたちなみに下記のエラーが出ました
Notice: Array to string conversion

投稿2014/12/25 07:17

shinoda

総合スコア75

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

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

m_kuwako

2014/12/25 07:31

[type]が配列型なので、普通の文字列のようにechoはできない。という意味です。 foreach ($a["0"]["aaa"]["bbb"]["0"] as $hoge) { var_dump($hoge); } とかにしたら中身見れると思います。
shinoda

2014/12/25 08:10

var_dumpで確認したところ[type]のところが下記のようになっていました array(1) { [0]=> array(2) { ["name"]=> string(9) "フリー" ["type"]=> string(4) "free" } } その先の要素を取得するにはどうすればいいのでしょうか? foreach ($a["0"]["aaa"]["bbb"]["0"]["type"]["0"] as $hoge) { echo $hoge; } など試したのですがダメでした。
m_kuwako

2014/12/25 09:10

foreach ($a["0"]["aaa"]["bbb"]["0"] as $hoge) { if ($hoge === 'type') { foreach ($hoge as $page) { echo $page; } } else { echo $hoge; } } 汚いですが、これならできるのではないでしょうか。
shinoda

2014/12/25 09:47

このコードなのですが$hogeにtypeというキーがあれば$pageを書き出すということですよね? 試したのですが間違いなく[no]の階層に[type]というキーはあるのにelseでecho $hogeになってしまいます。 私の認識が間違っていますでしょうか?
k.tada

2014/12/25 10:01

noもtypeも値ではなくキーだからではないでしょうか。 以下のようにしてはどうでしょうか? foreach ($a["0"]["aaa"]["bbb"]["0"] as $key => $hoge) { if ($key === 'type') { foreach ($hoge as $page) { echo $page; } } else { echo $hoge; } }
shinoda

2014/12/25 10:34

試してみましたがやはり条件分岐してしまいecho $hogeが出力されてしまいます 色々と試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問