お世話になります。
配列の中身を非表示にする方法はありますでしょうか?
やりたいことはif(empty)などで中身がなかった場合に非表示にするみたいなプログラムを実装したいのですがうまく行かなくて困っています。
ご享受いただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
コードが無いので、予測で書いてみたのですが、当たっていますかね?
lang
1<?php 2$array = array('aaa', 'bbb', 'ccc', '', false); 3 4foreach ($array as $value) { 5 if (!empty($value)) echo $value . "\n"; 6} 7 8/** 9* 出力結果 10* aaa 11* bbb 12* ccc 13*/
投稿2015/01/15 09:25
総合スコア82
0
ベストアンサー
このような形で実現出来ると思います。
lang
1$array = array(); 2 3$array[0]['aaa']['bbb'][1]['no'] = 1; 4$array[0]['aaa']['bbb'][1]['id'] = 101; 5$array[0]['aaa']['bbb'][1]['type']['name'] = ''; 6 7$array[1]['aaa']['bbb'][1]['no'] = 2; 8$array[1]['aaa']['bbb'][1]['id'] = 0; 9$array[1]['aaa']['bbb'][1]['type']['name'] = '鈴木'; 10 11foreach ($array as $value) { 12 $users = $value['aaa']['bbb'][1]; 13 14 if (!empty($users['no'])) echo $users['no'] . "\n"; 15 if (!empty($users['id'])) echo $users['id'] . "\n"; 16 if (!empty($users['type']['name'])) echo $users['type']['name'] . "\n"; 17}
配列を利用しているのであればforeach等を、利用しないと意味が無いです。
あと、何故うまく動作しなかったのか確認したいので、実際に書いたコードもこちらに貼って頂けると、より良い回答ができると思います。
投稿2015/01/15 10:05
総合スコア82
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ご回答された件はテストをしてみて結果を報告します。
foreachで書いたコードですが以下のような感じです。
*********************************************
foreach ((array)$obj as $key1 => $value1) {
foreach ((array)$value1 as $key2 => $value2) {
foreach ((array)$value2 as $key3 => $value3) {
foreach ((array)$value3 as $key4=> $value4) {
echo "$value4";
}
}
}
}
*************************************************
このようにひたすらネストして取り出そうとしたのですが上記の例で言うと4階層目は表示できるのですが他の階層は全てエラーになってしまいました。
私もどうにかforeachで表示したかったのですがこちらで質問させて頂いても解決策は見つからず個別に書きだすといったかたちになりました。
ご教授の程よろしくお願い致します。
配列の構造でどのようなパターンがあるのか知りたいです。
例えば、
$array[0]['aaa']['bbb'][1]['no'] = 1;
'aaa'や'bbb'は変わる可能性があるのか?
階層の深さは変わるのか?
などなど
追記いたします。
現在jsonファイルをphpでデコードしているのですが下記にコードを書きます
********************************************************
// ファイルからJSONを読み込み
$json = file_get_contents("test_1.json");
// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
// オブジェクト毎にパース
// trueを付けると連想配列として分解して格納する。
$obj = json_decode($json, true);
// パースに失敗した時は処理終了
if ($obj === NULL) {
echo("失敗");
return;
}
***********************************************************
この場合上記のご回答に当てはめた場合
foreach ($obj as $value) {
$users = $value['aaa']['bbb'][1];
if (!empty($users['no'])) echo $users['no'] . "\n";
if (!empty($users['id'])) echo $users['id'] . "\n";
if (!empty($users['type']['name'])) echo $users['type']['name'] . "\n";
}
上記のように書けばいいのでしょうか?
またキーを取り出したい場合は
foreach ($obj as $key1 => $value1)
このように書けばいいのでしょうか?
よろしくお願いいたします。
取り敢えずtest_1.jsonの中身が見えないと回答しにくいですが。
$array[0]['aaa']['bbb'][1]['no'] = 1;
$array[0]['aaa']['bbb'][1]['id'] = 101;
$array[0]['aaa']['bbb'][1]['type']['name'] = '';
$array[1]['aaa']['bbb'][1]['no'] = 2;
$array[1]['aaa']['bbb'][1]['id'] = 0;
$array[1]['aaa']['bbb'][1]['type']['name'] = '鈴木';
という構造であれば
foreach ($obj as $value) {
$users = $value['aaa']['bbb'][1];
if (!empty($users['no'])) echo $users['no'] . "\n";
if (!empty($users['id'])) echo $users['id'] . "\n";
if (!empty($users['type']['name'])) echo $users['type']['name'] . "\n";
}
で問題無いです。
> またキーを取り出したい場合は
> foreach ($obj as $key1 => $value1)
foreach ($obj as $key => $value)
「1」は不必要なので上記のような形で問題無いと思います。
試しに動作させて挙動を確認してみてください。
あと、配列の構造を把握してから、構築しないと意図せぬ動きになると思います。
一度、$objをvar_dumpなどでデバックして、構造を確認してみると良いかもしれません。
お世話になっております。
ご回答の件はこれから試してみたいと思います。
下記にjsonの構造を書いておきます。
**************************************
{
"aaa":
{
"bbb":[
{
"no":"1",
"groupname":"nagoya",
"groupname_j":"名古屋",
"basename":"zzz",
"name":"yyy",
"choice":"-",
"typename":"フリー",
"type":"free",
"types":[
{"name":"フリー","type":"free"}
]
}
{
"no":"2",
"groupname":"nagoya",
"groupname_j":"名古屋",
"basename":"ccc",
"name":"vvv",
"choice":"-",
"typename":"フリー",
"type":"free",
"types":[
{"name":"フリー","type":"free"}
]
}
]
}
}
*********************************************
このような感じになっております。
[0][aaa][bbb][0]
最後の[0]部分が[0][1][2]と続いていく感じです。
最後に全体的な流れを説明させていただきます
あるjsonファイル(オブジェクトで書かれている)をphpでデコードしてパースして連想配列に格納したものをphpで配列の追加、削除、編集してjsonファイルにエンコードするといった流れになります。
jsonファイルは私が作ったものではなくできるだけjsonファイルの構造を崩さず実装したいと考えております。
それではよろしくお願い致します。
追記いたします。
ただいまご回答の件を試しましたが
Notice: Undefined index: aaa in
というエラーがでました。
もう少し試してみたいと思います。
お世話になっております
色々と試した結果やはりforeachではうまくいきませんでした。
お手隙の時にでもご教授いただければ幸いです。
<?php
$json = json_decode(file_get_contents('array.json'), true);
foreach ($json['aaa']['bbb'] as $key => $value) {
foreach ($value as $userKey => $userValue) {
if (is_array($userValue)) {
foreach ($userValue[0] as $typeKey => $typeValue) {
echo (empty($typeValue))? '' : "{$typeKey} : {$typeValue}\n";
}
} else {
echo (empty($userValue))? '' : "{$userKey} : {$userValue}\n";
}
}
}
このような感じでどうでしょうか?
ちょっとtypesにどのようなデータが入るか分からないので、is_array部分の実装が微妙ですが。
お世話になっております
ご回答に気づかずご連絡が遅くなっていしまい申し訳ありません
ご回答の件は週明けに結果を報告いたします
お世話になっております
先ほど試しましたが危惧されていたとおりis_array部分でエラーが出ました
追加で質問なのですが
************************************************
$json = json_decode(file_get_contents('test_10.json'), true);
$_SESSION["i"] = ($_POST["id"]);
$i = htmlspecialchars($_SESSION["i"],ENT_QUOTES);
echo '<table id="name" border="1" >';
foreach ($json['aaa']['bbb'] as $key => $value) {
foreach ($value as $userKey => $userValue) {
if (is_array($userValue)) {
foreach ($userValue["0"] as $typeKey => $typeValue) {
echo (empty($typeValue))? '' : "<tr><th>{$typeKey}</th><td> {$typeValue}</td></tr>\n";
}
} else {
echo (empty($userValue))? '' : "<tr><th>{$userKey}</th><td>{$userValue}</td></tr>\n";
}
}
}
*******************************************************
今回このようにテーブルに表示したのですが上記の
($json['aaa']['bbb']['$i'] as $key => $value)
$iに前ページのフォームから来た数字を使って検索のようにしたいのですがうまく行きません
よろしかったらご教授お願い致します。
is_arrayの部分は中身次第なので書けません。
************************************************
$json = json_decode(file_get_contents('test_10.json'), true);
$_SESSION["i"] = ($_POST["id"]);
$i = htmlspecialchars($_SESSION["i"],ENT_QUOTES);
// $json['aaa']['bbb'][$i]が存在したらテーブル作成
if (!empty($json['aaa']['bbb'][$i])) {
echo '<table id="name" border="1" >';
foreach ($json['aaa']['bbb'][$i] as $userKey => $userValue) {
if (is_array($userValue)) {
// ここの挙動はtypesの中身によるので、書くのは無理です。
} else {
echo (empty($userValue))? '' : "<tr><th>{$userKey}</th><td>{$userValue}</td></tr>\n";
}
}
echo '</table>';
}
************************************************
基本的な部分で躓いているようなので、もう一度入門書などを購読したほうが良いかもしれません。
早速のご回答ありがとうございます。
上記のコードで検索が出来ました。
仰るとおりに基本からやりなして更に勉強したいと思います。
is_arrayの件なのですがjsonファイルの中は下記のようになっています
******************************************************
"types":[
{
"name":"フリー",
"type":"free"
}
],
******************************************************
pikonori様の言っている質問とは全く違うこと書いているのかもしれませんが何卒宜しくお願い致します。
コレでいかがでしょうか?
******************************************************
$json = json_decode(file_get_contents('test_10.json'), true);
$_SESSION["i"] = ($_POST["id"]);
$i = htmlspecialchars($_SESSION["i"],ENT_QUOTES);
// $json['aaa']['bbb'][$i]が存在したらテーブル作成
if (!empty($json['aaa']['bbb'][$i])) {
echo '<table id="name" border="1" >';
foreach ($json['aaa']['bbb'][$i] as $userKey => $userValue) {
if (is_array($userValue)) {
echo (empty($userValue[0]['name']))? '' : "<tr><th>name</th><td>{$userValue[0]['name']}</td></tr>\n";
echo (empty($userValue[0]['type']))? '' : "<tr><th>type</th><td>{$userValue[0]['type']}</td></tr>\n";
} else {
echo (empty($userValue))? '' : "<tr><th>{$userKey}</th><td>{$userValue}</td></tr>\n";
}
}
echo '</table>';
}
お世話になっております
typeの部分はうまくいきました。
typeの部分のように下の階層にあるものは同じようにその下に書き足していけばいいのでしょうか?
書き足してみたのですが一番上のキーと要素だけが取り出されてしまいました。
このコードは[aaa][bbb][$i]の階層までを$userValueに格納してその下のif文の$userValue[0]['name']のところで$userValueよりも下の階層をループさせているという認識であっていますでしょうか?
$userValue[0]の[0]が理解ができなくて悩んでおります。
ご教授いただければ幸いです。
> このコードは[aaa][bbb][$i]の階層までを$userValueに格納してその下のif文の$userValue[0]['name']のところで$userValueよりも下の階層をループさせているという認識であっていますでしょうか?
と言うよりはtypesのデータ次第ですので、書き方は色々存在しますが、shinodaさんが提示したtypesのデータだと、この書き方で要求は満たせると判断しました。
データのパターンを洗い出して、コーディングした方が良いと思います。
あくまでも参考程度のコーディングだと判断して下さい。
> $userValue[0]の[0]が理解ができなくて悩んでおります。
単純に、typesの配列が
"types":[
{
"name":"フリー",
"type":"free"
}
],
のようになっているので、typesの中には配列で1つの要素だけ入っていると判断しています。
お世話になっております
ご丁寧に説明有り難うございます。
ということは
"types":[
{
"name":"フリー",
"type":"free"
},
{
"name":"フリー",
"type":"free"
},
],
このようになっていた場合はどうすればよいのでしょうか?
[]を空にすればいいのでしょうか?
[]では動かないです。
複数存在する場合は、foreachで実装すれば良いと思います。
ということは
foreach ($json['aaa']['bbb'][$i] as $userKey => $userValue)
の下に
foreach ($json['aaa']['bbb'][$i]['types'] as $userKey => $userValue)
をネストするということですか?

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/01/15 09:48
2015/01/15 10:01