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

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

ただいまの
回答率

90.47%

  • PHP

    20902questions

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

php 配列の中身を非表示

解決済

回答 2

投稿

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

shinoda

score 82

お世話になります。
配列の中身を非表示にする方法はありますでしょうか?

やりたいことはif(empty)などで中身がなかった場合に非表示にするみたいなプログラムを実装したいのですがうまく行かなくて困っています。
ご享受いただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

このような形で実現出来ると思います。

$array = array();

$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 ($array 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等を、利用しないと意味が無いです。
あと、何故うまく動作しなかったのか確認したいので、実際に書いたコードもこちらに貼って頂けると、より良い回答ができると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/15 19:23

    ご回答された件はテストをしてみて結果を報告します。
    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で表示したかったのですがこちらで質問させて頂いても解決策は見つからず個別に書きだすといったかたちになりました。

    ご教授の程よろしくお願い致します。

    キャンセル

  • 2015/01/15 19:35

    配列の構造でどのようなパターンがあるのか知りたいです。
    例えば、
    $array[0]['aaa']['bbb'][1]['no'] = 1;
    'aaa'や'bbb'は変わる可能性があるのか?
    階層の深さは変わるのか?
    などなど

    キャンセル

  • 2015/01/15 19:51

    追記いたします。
    現在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)

    このように書けばいいのでしょうか?

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

    キャンセル

  • 2015/01/15 20:03

    取り敢えず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などでデバックして、構造を確認してみると良いかもしれません。

    キャンセル

  • 2015/01/16 11:27

    お世話になっております。
    ご回答の件はこれから試してみたいと思います。
    下記に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ファイルの構造を崩さず実装したいと考えております。

    それではよろしくお願い致します。

    キャンセル

  • 2015/01/16 11:39

    追記いたします。
    ただいまご回答の件を試しましたが
    Notice: Undefined index: aaa in
    というエラーがでました。

    もう少し試してみたいと思います。

    キャンセル

  • 2015/01/19 19:36

    お世話になっております
    色々と試した結果やはりforeachではうまくいきませんでした。
    お手隙の時にでもご教授いただければ幸いです。

    キャンセル

  • 2015/01/19 21:19

    <?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部分の実装が微妙ですが。

    キャンセル

  • 2015/01/23 13:40

    お世話になっております
    ご回答に気づかずご連絡が遅くなっていしまい申し訳ありません
    ご回答の件は週明けに結果を報告いたします

    キャンセル

  • 2015/01/23 20:23

    お世話になっております
    先ほど試しましたが危惧されていたとおり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に前ページのフォームから来た数字を使って検索のようにしたいのですがうまく行きません
    よろしかったらご教授お願い致します。

    キャンセル

  • 2015/01/23 20:52

    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>';
    }
    ************************************************
    基本的な部分で躓いているようなので、もう一度入門書などを購読したほうが良いかもしれません。

    キャンセル

  • 2015/01/23 21:07

    早速のご回答ありがとうございます。
    上記のコードで検索が出来ました。
    仰るとおりに基本からやりなして更に勉強したいと思います。

    is_arrayの件なのですがjsonファイルの中は下記のようになっています
    ******************************************************
    "types":[
    {
    "name":"フリー",
    "type":"free"
    }
    ],

    ******************************************************

    pikonori様の言っている質問とは全く違うこと書いているのかもしれませんが何卒宜しくお願い致します。

    キャンセル

  • 2015/01/23 21:23

    コレでいかがでしょうか?

    ******************************************************
    $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>';
    }

    キャンセル

  • 2015/01/26 11:53

    お世話になっております
    typeの部分はうまくいきました。
    typeの部分のように下の階層にあるものは同じようにその下に書き足していけばいいのでしょうか?
    書き足してみたのですが一番上のキーと要素だけが取り出されてしまいました。

    このコードは[aaa][bbb][$i]の階層までを$userValueに格納してその下のif文の$userValue[0]['name']のところで$userValueよりも下の階層をループさせているという認識であっていますでしょうか?
    $userValue[0]の[0]が理解ができなくて悩んでおります。

    ご教授いただければ幸いです。

    キャンセル

  • 2015/01/26 13:08

    > このコードは[aaa][bbb][$i]の階層までを$userValueに格納してその下のif文の$userValue[0]['name']のところで$userValueよりも下の階層をループさせているという認識であっていますでしょうか?

    と言うよりはtypesのデータ次第ですので、書き方は色々存在しますが、shinodaさんが提示したtypesのデータだと、この書き方で要求は満たせると判断しました。
    データのパターンを洗い出して、コーディングした方が良いと思います。
    あくまでも参考程度のコーディングだと判断して下さい。

    > $userValue[0]の[0]が理解ができなくて悩んでおります。

    単純に、typesの配列が
    "types":[
    {
    "name":"フリー",
    "type":"free"
    }
    ],
    のようになっているので、typesの中には配列で1つの要素だけ入っていると判断しています。

    キャンセル

  • 2015/01/26 15:57

    お世話になっております
    ご丁寧に説明有り難うございます。

    ということは
    "types":[
    {
    "name":"フリー",
    "type":"free"
    },
    {
    "name":"フリー",
    "type":"free"
    },
    ],

    このようになっていた場合はどうすればよいのでしょうか?
    []を空にすればいいのでしょうか?

    キャンセル

  • 2015/01/26 16:25

    []では動かないです。
    複数存在する場合は、foreachで実装すれば良いと思います。

    キャンセル

  • 2015/01/26 16:33

    ということは
    foreach ($json['aaa']['bbb'][$i] as $userKey => $userValue)
    の下に
    foreach ($json['aaa']['bbb'][$i]['types'] as $userKey => $userValue)
    をネストするということですか?

    キャンセル

0

コードが無いので、予測で書いてみたのですが、当たっていますかね?
<?php
$array = array('aaa', 'bbb', 'ccc', '', false);

foreach ($array as $value) {
    if (!empty($value)) echo $value . "\n";
}

/**
* 出力結果
* aaa
* bbb
* ccc
*/

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/01/15 18:48

    お世話になります。
    詳しく説明させていただきます。
    ************************************************

    ["0"]["aaa"]["bbb"]["1"][no]
    ["0"]["aaa"]["bbb"]["1"][id]
    ["0"]["aaa"]["bbb"]["1"][type][name]
    ["1"]["aaa"]["bbb"]["1"][no]
    ["1"]["aaa"]["bbb"]["1"][id]
    ["1"]["aaa"]["bbb"]["1"][type][name]

    ************************************************

    上記のような配列がありまして多次元配列なのでforeachでうまく表示できなかったので今は
    echo "["1"]["aaa"]["bbb"]["1"][no] ";
    のように個別に呼び出しています。
    また上記のような配列がその下にもあり検索をするときには
    echo "["1"]["aaa"]["bbb"]["$i"][no] ";
    のように$iに代入して検索しているのですが中身があるのとないものがあるのでない場合に非表示にしたいと考えております。

    私の知識が乏しく質問も説明もわかりづらいとは思いますがご教授いただければ幸いです。

    キャンセル

  • 2015/01/15 19:01

    なるほど、別で回答します。

    キャンセル

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

  • PHP

    20902questions

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

閲覧数の多いPHPの質問