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

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

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

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

PHP

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

Laravel 5

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

Q&A

解決済

1回答

2508閲覧

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

KIYZ

総合スコア17

Laravel

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

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2018/06/28 11:24

編集2018/06/28 11:33

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:

php

1$collection = collect([ 2 ['product_id' => 'prod-100', 'name' => 'Desk'], 3 ['product_id' => 'prod-200', 'name' => 'Chair'], 4]); 5 6$plucked = $collection->pluck('name'); 7 8$plucked->all(); 9 10// ['Desk', 'Chair']

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

php

1$plucked = $collection->pluck('name', 'product_id'); 2 3$plucked->all(); 4 5// ['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' となるのはなぜなのでしょうか。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. 「キーを指定することができる」のですから、第二引数がキーとならないとおかしいのではないでしょうか。キーを指定することができるものを開発者は作りたかったのだと思います。
  2. 「キーを指定することができる」ものを作りたくって、作ったpluckでキーがつかない平坦な値が取られたらおかしいと思います。第一引数も第二引数もおなじ意味(valueを取るもの)になるのは変です。

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

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

投稿2018/06/28 13:26

papinianus

総合スコア12705

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

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

KIYZ

2018/06/30 07:33

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問