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

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

ただいまの
回答率

88.20%

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,972

shinoda

score 88

お世話になります。
現在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]から下の部分になります。

長文なうえ説明不足があるとは思いますがご教授お願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

1に関しては
foreach ($a["0"]["aaa"]["bbb"]["0"] as $hoge) {
   echo $hoge;
}
でなんとかなりそうです。

2に関しては
>配列は受け取っているのですがその後どうやって追加したらいいですか? 
何に何を追加したいのでしょうか。

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/12/25 17:13

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

    キャンセル

  • 2014/12/25 18:06

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

    キャンセル

  • 2014/12/25 19: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の中に配列で入りその配列を既存の配列の後ろに追加していきたいということです。
    新規と既存の配列は全く同じ構造にしたいと思っています。

    うまく説明できていないとは存じますが何卒お願い致します。

    キャンセル

checkベストアンサー

0

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

1.
foreach ($a["0"]["aaa"]["bbb"]["0"] as $key => $val) {
    if (is_array($val)) {
        foreach ($val as $k => $v) {
            echo $v;
        }
    } else {
        echo $val;
    }
}

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/06 17: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
    というエラーがでました。

    宜しくお願い致します。

    キャンセル

  • 2015/01/06 17:28

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

    キャンセル

  • 2015/01/06 18:49

    申し訳ございません
    私のミスでした。仰るとおりの方法でうまくできました。
    array_pushより空で追加したほうが早いみたいなのでそちらでうまくいきました。

    1のキーと要素の取得に関してはうまくいかないのでとりあえずひとつずつ書き出しています。
    これからも勉強してブラッシュアップしていきます。

    キャンセル

0

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


投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2014/12/25 18:47

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

    キャンセル

  • 2014/12/25 19:01

    noもtypeも値ではなくキーだからではないでしょうか。
    以下のようにしてはどうでしょうか?

    foreach ($a["0"]["aaa"]["bbb"]["0"] as $key => $hoge) {
    if ($key === 'type') {
    foreach ($hoge as $page) {
    echo $page;
    }
    } else {
    echo $hoge;
    }
    }

    キャンセル

  • 2014/12/25 19:34

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

    キャンセル

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

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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