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

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

ただいまの
回答率

88.10%

[PHP/Laravel] クラスのプロパティを動的に取得したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,012

score 10

環境:PHP7.2.9 / Laravel5.7

下記の「$dog->$key」というのがエラーになります。
「$dog->kind」のようにプロパティを取得したいのですが、
どのように書けばよろしいでしょうか。
($dogにはDBから取得したデータを格納しており、コントローラーからビューファイルへ連携。kindカラムが存在する)
・命名は質問用に変更しています。

ビュー

# resources/views/dog.blade.php
@foreach (Config::get('select.dogs') as $key => $value)
    <p>{{ $value['title'] }}</p>    # 品種
    <p>{{ $dog->kind }}</p>         # チワワ    <-これではなく下記のように取得したい。
    <p>{{ $dog->$key }}</p>         # エラー!  <-$key には"kind","weight","comment"が順番に入る。
@endforeach

「Config::get('select.dogs')」は下記のように記載しています。

# config/select.php
return [
    'dogs' => [
        'kind' => [
            'group' => '動物',
            'title' => '品種'
        ],
        'weight' => [
            'group' => '動物',
            'title' => '体重',
        ],
        'comment' => [
            'group' => '動物',
            'title' => 'コメント',
        ],
        ・・・
    ],
];

「dog」テーブル定義(例)

    public function up()
    {
        Schema::create('password_resets', function (Blueprint $table) {
            table->bigIncrements('id');
            $table->string('kind');
            $table->string('age');
            $table->string('weight');
            $table->string('name');
            $table->string('comment');
            $table->timestamps();
        });
    }

質問が分かりにくければご指摘ください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/05/29 06:46

    エラーが出るのであればエラーメッセージをそのままご提示ください

    キャンセル

  • getHappiness

    2019/05/29 20:22 編集

    申し訳ありません、こちらがエラーメッセージです。
    「Config::get('select.dogs')」をループさせて、そのキーになっているカラムを、dogモデルから取得したい、のです。
    hentaimanさんの通り、定義方法は見直した方が良さそうですね。

    ■「<?php echo $dog[$key]; ?>」と記載した場合
    Array to string conversion (View: /Users/xxxxxx/WebServer/Documents/laravel-app/document-root/resources/views/customer/dog.blade.php)

    ■「{{ $dog[$key] }}」と記載した場合
    htmlspecialchars() expects parameter 1 to be string, array given (View: /Users/xxxxxx/WebServer/Documents/laravel-app/document-root/resources/views/customer/dog.blade.php)

    キャンセル

  • getHappiness

    2019/06/02 19:24

    hentaimanさん、alo10さん、ご回答ありがとうございました。
    構造を変えてご教示いただいた方法で取得できました。

    キャンセル

回答 2

+2

$dog[$key]

@if(is_array($dog[$key])){
   <p>{{ $key }}</p>は配列
}
@endif


質問文に書かれているconfigを使って取る前提の書き方です。
オブジェクトの場合はaro10さんの回答と合わせてご確認下さい。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/29 06:37

    ありがとうございます。
    上記のように記載すると、「Array to string conversion」のエラーが出ました。

    上記エラーとddでの出力で私の認識が謝っていたことに気づきました。
    本件は「クラスのプロパティを動的に取得したい」ではなく、「連想配列を持つオブジェクトのキーのみを取得したい」ということになります。

    $key='kind' ですので、
    「$dog[$key]」で取得されるのは、以下の配列が取得されてしまいます。
    'kind' のみを取得する方法はありませんでしょうか。

    'kind' => [
    'group' => '動物',
    'title' => '品種'
    ],

    キャンセル

  • 2019/05/29 07:09 編集

    要件に沿った書き方で回答を更新しました。
    ですけど、回答に書いたようなifが必要にならないようにconfig/select.phpの定義を見直した方が無難だと思います。
    SQLで言うと*を使わないようにプログラム作って行くのに近い考え方かもしれません。*を使わない思想に対しての是非はあるでしょうが。

    キャンセル

checkベストアンサー

0

配列であれば、hentaimanさんの方法で可能で、
オブジェクトであれば、以下のようにしてプロパティ名を変数によって動的に指定可能です。
PHP 可変プロパティの例

    #配列の添字を動的に指定
    $ary = ["test"=>100];
    $aryKey = "test";
    dd($ary[$aryKey]);

    #オブジェクトのプロパティ名を動的に指定
    class obj {
        public $test = 100;
    }

    $obj = new obj();

    $objKey = "test";
    dd($obj->{$objKey});

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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