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

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

ただいまの
回答率

90.10%

【php】多次元配列に含まれる値をもとに、タブを生成したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 552

kotaosu

score 11

タイトルのとおりなのですが、
多次元配列内に含まれるキー"ID"の値ごとにタブを作成したいと思っています。
しかしコード上での書き方がわからず、お手上げになってしまい、質問させていただきます。

<?php
$ID_list = array(
        "aiueo" ,
        "sasisuseso" ,
        "kakikukeko" 
);

$DATA_list = 
array(
    array(
        array(
            "日付" => "2017/01/01",
            "時間" =>"00:00:00",
            "名前"=> "tarou",
            "ID"=> "aiueo"
        ),
        array(
            "日付" => "2017/01/02",
            "時間" =>"00:00:10",
            "名前"=> "tarou",
            "ID"=> "aiueo"
            )
        ),        
    array(
        array(
            "日付" => "2017/01/03",
            "時間" =>"00:00:00",
            "名前"=> "yamada",
            "ID"=> "kakikukeko"
            ),
        array(
            "日付" => "2017/01/03",
            "時間" =>"00:00:10",
            "名前"=> "yamada",
            "ID"=> "kakikukeko"
        )
    ),
    array(
        array(
            "日付" => "2017/01/04",
            "時間" =>"00:00:00",
            "名前"=> "poppy",
            "ID"=> "sasisuseso"
        )
    )
);
?>


以下のURLでは正規表現を利用していましたが、今回はそれが利用できないため
手間取っています。
https://teratail.com/questions/113442

if (count($ID_list) > 0 && count($DATA_list) > 0) {
    $tab = '<p id="tabcontrol">' . PHP_EOL;
    $tab_contents = '<div id="tabbody">' . PHP_EOL;
    $count = 1;
    foreach ($ID_list as $val) {
        $tab .= '<a href="#tabpage' . $count . '">' . htmlspecialchars($val) . '</a>' . PHP_EOL;
        $tab_contents .= '<div id="tabpage' . $count . '">' . PHP_EOL;

        $check = false;
*/恐らくここを改変すればいける気がする----------------------------------
        foreach ($DATA_list as $row) {
            if (preg_grep("/{$val}/", $row)) {
                $tab_contents .= implode("<br />", $row) . PHP_EOL;
            }
        }
--------------------------------------------------------------------/*
        $tab_contents .= '</div>' . PHP_EOL;
        $count ++;
    }
    $tab .= '</p>' . PHP_EOL;
    $tab_contents .= '</div>' . PHP_EOL;
}
echo $tab;
echo $tab_contents;
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+1

    array(
'ID' => "aiueo" ,
'ID' => "sasisuseso" ,
'ID' => "kakikukeko" 
)

おなじキー名で要素を指定するとどんどん上書きされますよ

$a=array(
  'ID' => "aiueo" ,
  'ID' => "sasisuseso" ,
  'ID' => "kakikukeko" 
  );
print_r($a);

 追記

データ管理方法を変えてもいいのでしょうか?
であればこうするとデータアクセスがそうとう楽になるとおもいます

$ID_list = [
  "aiueo",
  "sasisuseso",
  "kakikukeko", 
];

$DATA_list = [
  "aiueo"=>[
    [
      "日付" => "2017/01/01",
      "時間" =>"00:00:00",
      "名前"=> "tarou",
      "ID"=> "aiueo",
      ],
    [
      "日付" => "2017/01/02",
      "時間" =>"00:00:10",
      "名前"=> "tarou",
      "ID"=> "aiueo",
      ],
    ],
  "kakikukeko"=>[
    [
      "日付" => "2017/01/03",
      "時間" =>"00:00:00",
      "名前"=> "yamada",
      "ID"=> "kakikukeko",
      ],
    [
      "日付" => "2017/01/03",
      "時間" =>"00:00:10",
      "名前"=> "yamada",
      "ID"=> "kakikukeko",
      ],
    ],
  "sasisuseso"=>[
    [
      "日付" => "2017/01/04",
      "時間" =>"00:00:00",
      "名前"=> "poppy",
      "ID"=> "sasisuseso",
      ],
    ],
];

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/26 18:08

    あ、ようやく理解できました。キーが一緒だと上書きされてしまうので、だめということですよね。
    今$ID_listを出力したところ以下のようになりました。そのため、もしかしたらキーは設定されてないかもしれないです。
    array(3) {
    [0]=>
    string(5) "aiueo"
    [3]=>
    string(10) "sasisuseso"
    [6]=>
    string(10) "kakikukeko"
    }

    キャンセル

  • 2018/02/26 18:15

    そのデータでしたら私が追記したデータと合致するので問題ないと思います。
    $DATA_listについては、すでにIDごとにグルーピングされているようですが
    実体としてIDごとかどうか担保されていません。
    もしIDごととにまとめられているという保証があるのであれば
    最初のデータのIDを拾えば$ID_listとのヒモ付は可能です

    キャンセル

  • 2018/02/26 18:32

    IDごとにまとめられていると思います。ですので恐らく紐付けはできると考えています。
    質問の2つめのコードにある「恐らくここを改変すればいける気がする」の欄を書き換えれば
    可能だと思うのですが、コード上でどのように修正したらよろしいでしょうか。

    キャンセル

checkベストアンサー

0

yambejpさんの回答の流れで回答します。

*/恐らくここを改変すればいける気がする----------------------------------
        foreach ($DATA_list as $row) {
            if (preg_grep("/{$val}/", $row)) {
                $tab_contents .= implode("<br />", $row) . PHP_EOL;
            }
        }
--------------------------------------------------------------------/*


の部分を$DATA_listから$valに一致するキーを拾ってくるだけなので、

if (array_key_exists($key, $DATA_list)) {
    $tab_contents .= implode("<br />", $DATA_list[$key]) . PHP_EOL;
}


で良いです。

参考:
array_key_exists
連想配列

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/07 16:59

    今$keyは未定義の状態なのですが、ループさせてキーの値を入れていく感じでしょうか。

    キャンセル

  • 2018/03/07 17:13

    $valですね。失礼しました。

    キャンセル

  • 2018/03/13 14:15

    やっと理解できました。ありがとうございました!

    キャンセル

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

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