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

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

ただいまの
回答率

90.51%

  • PHP

    20344questions

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

  • Laravel 5

    1883questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    666questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel の pluck() メソッドの仕様について

解決済

回答 1

投稿 編集

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

KIYZ

score 10

Laravel の pluck() メソッドの仕様について学ぼうと思い公式ドキュメントを参照したのですが、サンプルコードの結果が理解できません。

公式ドキュメント
https://laravel.com/docs/5.4/collections#method-pluck

非公式日本語ドキュメント
https://readouble.com/laravel/5.4/ja/collections.html#method-pluck

pluck()

The pluck method retrieves all of the values for a given key:

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

$plucked = $collection->pluck('name');

$plucked->all();

// ['Desk', 'Chair']


You may also specify how you wish the resulting collection to be keyed:

$plucked = $collection->pluck('name', 'product_id');

$plucked->all();

// ['prod-100' => 'Desk', 'prod-200' => 'Chair']

 疑問

「返り値のコレクションのキー項目も指定できます。」という説明文の意味自体は何となく理解できるのですが、二つ目のサンプルコードの結果の部分がなぜそうなるのか、そうなるとどういう状況で便利になるのかが理解できません。

1:
まず、(一つ目のサンプルコードと違い、)返り値はなぜ連想配列?になるのでしょうか。

2:
一つ目のサンプルコードのように
['Desk', 'Chair', 'prod-100', 'prod-200']
とならないのはなぜなのでしょうか。

3:
pluck() 呼び出し時に引数に先に 'name' を渡しているにも関わらず、 'product_id' の値である 'prod-100' や 'prod-200' がキーとなり、 その値が 'Desk' や 'Chair' となるのはなぜなのでしょうか。

ご教授のほどよろしくお願い申し上げます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

  1. 「キーを指定することができる」のですから、第二引数がキーとならないとおかしいのではないでしょうか。キーを指定することができるものを開発者は作りたかったのだと思います。
  2. 「キーを指定することができる」ものを作りたくって、作ったpluckでキーがつかない平坦な値が取られたらおかしいと思います。第一引数も第二引数もおなじ意味(valueを取るもの)になるのは変です。
    (もしそういうことがしたかったら、第一引数が文字列だけでなく、配列も受けつけるように(mixed)するのが筋で、対象からvalueを抜き出すパラメータが2つあるのは関数の設計として変です。
  3. pluckの第一引数が、valueを示すもの、第二引数がkeyを示すもので、返り値がkey => valueになっているということですが、これは引数が1個の場合を許しているからです。他の多くのphpの関数でもそうですが、後ろのほうの引数が任意指定(あってもなくてもいい)という作りをしていることが多いです。そのように設計しようとすると、同じ意味のものは同じ場所になければなりません。valueを示すものが、引数の個数によって1個目だったり2個目だったりするのは(pluckの開発者にとって)とても大変なのです。また個数が違うと場所が変わっていく、というのは関数を覚える上でもわかりにくいと思います。もちろんvalueを示すのは最後という覚えかたもできなくはないですが、多くのプログラミング言語において、引数の個数違いを許す場合は、引数のn番目の位置が意味が変わらないようになっています。
    ちなみに、そういう"自分の考えかたと違う動作"が、理解の妨げになるような場合には、ラッパを作るというのも一つの手だと思います(この場合少々難しいとは思いますが)

↑こうした細かな疑問より、最初に書いておられる「どういう状況で便利になるのかが理解でき」ないと混乱すると思います。
私はLaravelに明るくないですが、これを見てarray_columnだと思いました。つまりpluckがやりたいことは標準関数でもやりたいくらい、一般にとてもやりたいことなのです。
具体的には、DBのようなテーブルのかたちをしたデータを配列で取ってきたときに、IDのようなユニークキーでまとめるときに有用です。連想配列のキーがあるというのは、IDが分かっていると、2次元配列の欲しいデータをループしなくても、直接指定できるので便利なのです。
同様の記事は多数ありますが、とりあえずの参考

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/30 16:33

    お陰様でしっかりと理解することができました。
    こちらのご回答を頂けていなければ、きっと今後似たような関数に行き会った時に同じような疑問を抱いていたと思います。
    いつも丁寧で分かりやすい解説をして頂き本当にありがとうございます。

    キャンセル

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

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

関連した質問

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

  • PHP

    20344questions

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

  • Laravel 5

    1883questions

    Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

  • Laravel

    666questions

    LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。