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

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

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

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

Q&A

解決済

3回答

1590閲覧

同じ値を持つ連想配列から違う値をリスト表示したい

natsuhayate8

総合スコア13

PHP

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

0グッド

0クリップ

投稿2016/02/28 06:35

連想配列で特定のキーをベースに他のキーの値を表示したいと考えております。
下記に内容を記載しました。

【print_rで出力したもの】

Array (
[0] => Array ( [food] => お肉 [food_name] => 牛肉 [food_id] => 36)
[1] => Array ( [food] => お肉 [food_name] => 豚肉 [food_id] => 37)
[2] => Array ( [food] => お肉 [food_name] => 鶏肉 [food_id] => 38)
[3] => Array ( [food] => 野菜 [food_name] => キャベツ [food_id] => 39)
[4] => Array ( [food] => 野菜 [food_name] => レタス [food_id] => 42)
[5] => Array ( [food] => 野菜 [food_name] => キュウリ [food_id] => 40)
[6] => Array ( [food] => 野菜 [food_name] => ニンジン [food_id] => 41)
[7] => Array ( [food] => 野菜 [food_name] => カボチャ [food_id] => 43)
[8] => Array ( [food] => お魚 [food_name] => カツオ [food_id] => 45)
[9] => Array ( [food] => お魚 [food_name] => マグロ [food_id] => 44)
)

【結果として出したいもの】

<h3>お肉</h3> <div class="36">牛肉</div> <div class="37">豚肉</div> <div class="38">鶏肉</div> <h3>野菜</h3> <div class="39">キャベツ</div> <div class="42">レタス</div> <div class="40">キュウリ</div> <div class="41">ニンジン</div> <div class="43">カボチャ</div> <h3>お魚</h3> <div class="45">カツオ</div> <div class="44">マグロ</div>

私が考えたやり方としては
$array = 配列;
foreach ($array as $key=>$val);
のようにforeachをつかって試しましたがやり方がわかりませんでした。

どなたか分かる方がいましたら教えていただけたら幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

この場合はこれでいいのではないですかね。
foodとfood_idでソートすれば尚いいんでしょうけど。

php

1$array = array( 2 array( 3 "food" => "お肉", 4 "food_id" => 36, 5 "food_name" => "牛肉" 6 ), 7 array( 8 "food" => "お肉", 9 "food_id" => 37, 10 "food_name" => "豚肉" 11 ), 12 array( 13 "food" => "お肉", 14 "food_id" => 38, 15 "food_name" => "鶏肉" 16 ), 17 array( 18 "food" => "野菜", 19 "food_id" => 39, 20 "food_name" => "キャベツ" 21 ), 22 array( 23 "food" => "野菜", 24 "food_id" => 42, 25 "food_name" => "レタス" 26 ), 27 array( 28 "food" => "野菜", 29 "food_id" => 40, 30 "food_name" => "キュウリ" 31 ), 32 array( 33 "food" => "魚", 34 "food_id" => 45, 35 "food_name" => "カツオ" 36 ), 37 array( 38 "food" => "魚", 39 "food_id" => 44, 40 "food_name" => "マグロ" 41 ), 42); 43 44usort($array, function ($a, $b) { return $a['food_id'] - $b['food_id']; }); 45$last = null; 46foreach( $array as $value){ 47 if( $last != $value['food']){ 48 echo "<h3>{$value['food']}</h3>\n"; 49 } 50 echo "<div class=\"{$value['food_id']}\">{$value['food_name']}</div>\n"; 51 $last = $value['food']; 52}

投稿2016/03/01 06:26

編集2016/03/01 06:29
pochi0701

総合スコア210

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

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

natsuhayate8

2016/03/04 23:16

非常に見やすく、思い通りのものができました! こういう書き方もあるのだと、大変勉強になりました。
guest

0

>【print_rで出力したもの】

これがどんなデータを出力したのかわかりませんでした。
このデータをそのまま使うことが必須でなければ以下の様なデータ構造にすることでforeachで綺麗に回せると思います。

php

1$food = array( 2 "お肉"=>array(36=>"牛肉",37=>"豚肉",38=>"鶏肉"), 3 "野菜"=>array(39=>"キャベツ",42=>"レタス",40=>"キュウリ",41=>"にんじん",43=>"かぼちゃ"), 4 "お魚"=>array(45=>"カツオ",44=>"マグロ"), 5);

投稿2016/02/28 20:33

piyoon

総合スコア68

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

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

0

foreachをつかって試しましたがやり方がわかりませんでした。

どのようなコードを試したのか興味があります。
よろしければ載せていただけますか?

ぱっと思い浮かんだ回答です。
もっと効率よい回答はあるはずです(分かりやすいかどうかは別として)。

他の方、もっと良い回答ありませんか?

php

1<?php 2$array = array( 3 array( 4 "food" => "meet", 5 "food_id" => 36, 6 "food_name" => "beef" 7 ), 8 array( 9 "food" => "meet", 10 "food_id" => 37, 11 "food_name" => "chicken" 12 ), 13 array( 14 "food" => "vegetable", 15 "food_id" => 38, 16 "food_name" => "cabbage" 17 ), 18 array( 19 "food" => "vegetable", 20 "food_id" => 39, 21 "food_name" => "kappa" 22 ), 23 array( 24 "food" => "fish", 25 "food_id" => 40, 26 "food_name" => "tuna" 27 ), 28 array( 29 "food" => "fish", 30 "food_id" => 41, 31 "food_name" => "ika" 32 ), 33); 34 35//グループごとにまとめてみた 36foreach ($array as $value) 37 $food_groups[$value["food"]][$value["food_id"]] = $value["food_name"]; 38 39//こんな感じになる 40/*array(3) { 41 ["meet"]=> 42 array(2) { 43 [36]=> 44 string(4) "beef" 45 [37]=> 46 string(7) "chicken" 47 } 48 ["vegetable"]=> 49 array(2) { 50 [38]=> 51 string(7) "cabbage" 52 [39]=> 53 string(5) "kappa" 54 } 55 ["fish"]=> 56 array(2) { 57 [40]=> 58 string(4) "tuna" 59 [41]=> 60 string(3) "ika" 61 } 62}*/ 63$current_food = null; 64 65foreach ($food_groups as $food => $names) { 66 if($current_food !== $food) 67 echo "<h3>" . $food . "</h3>" . PHP_EOL; //コンソールで確認したので、PHP_EOLを記述してます。 68 $current_food = $food; 69 70 foreach ($names as $id => $name) { 71 echo "<div class={$id}>" . $name . "</div>" . PHP_EOL; 72 } 73} 74

コンソールに表示された結果

<h3>meet</h3> <div class=36>beef</div> <div class=37>chicken</div> <h3>vegetable</h3> <div class=38>cabbage</div> <div class=39>kappa</div> <h3>fish</h3> <div class=40>tuna</div> <div class=41>ika</div>

投稿2016/02/28 12:34

hernia_orz

総合スコア58

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

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

JinwonKim

2016/02/29 06:38

if文は要らないと思います。
natsuhayate8

2016/03/04 23:12

自分が書いたコードは未完成なうえに書き方が汚いので、お恥ずかしながら乗せられるようなものではありません...。 自分もforeachの中にforeachを入れるやり方でやろうとして断念しましたが、 $food_groups[$value["food"]][$value["food_id"]] = $value["food_name"];の部分が、初めて見た書き方で大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問