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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

2325閲覧

cakephp3 ブックマークチュートリアルの Collection

blossan

総合スコア154

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2016/10/12 02:07

お世話になります。
cakephp3のブックマークチュートリアルを勉強しています。
こちらのサイトで勉強しています。
http://book.cakephp.org/3.0/ja/tutorials-and-examples/bookmarks/part-two.html

このサイトの「計算済みフィールドを追加」の記述について詳しくお聞きしたいと思います。
コードの内容は、記事のタグ登録の際に、コンマで繋がれたタグを分ける機能だと思います。

protected function _getTagString()
{
if (isset($this->_properties['tag_string'])) {
return $this->_properties['tag_string'];
}
if (empty($this->tags)) {
return '';
}
$tags = new Collection($this->tags);
$str = $tags->reduce(function ($string, $tag) {
return $string . $tag->title . ', ';
}, '');
return trim($str, ', ');
}

このソースコードで以下の記述がよくわかりません。

$tags = new Collection($this->tags);
$str = $tags->reduce(function ($string, $tag) {
return $string . $tag->title . ', ';
}, '');

コレクションの意味や、reduce というメソッドに関数が入っている構造の解説を頂きたいと思います。
できれば、各変数の意味(例えば、function ($string)の$stringとは?)を具体的に教えて頂けると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

この処理はタグの配列を、カンマ区切りの一つの文字列に変換する処理です。

Collectionクラスは、配列を操作するクラスです。
Collectionはnewするときに引数に配列を受け取ります。ここではタグの配列を渡しています。
reduce関数は、配列の個々の要素を順次処理して、1つの値にします。ここでは文字列にしたいのです。
reduce関数の引数は2つあり、第一引数は無名関数です。第二引数は初期値です。ここでは文字列の初期値は空文字列です。reduce関数は、配列の要素の数だけ、無名関数を実行します。
無名関数の引数は2つあり、第一引数の$stringは、ここまで処理した文字列が入っています。第二引数の$tagはタグの配列の要素です。
無名関数内では、今までの$stringに$tag->titleを文字列結合して、最後にカンマを結合してreturnしています。このreturnした値が次の要素の処理では引数$stringの値としてまた受け取ります。

以下のように関数内にdebugを入れると各値が出力できるので、どのように処理しているかわかると思います。

php

1$tags = new Collection($this->tags); 2$str = $tags->reduce(function ($string, $tag) { 3debug($string); 4debug($tag); 5return $string . $tag->title . ', '; 6}, '');

ぶっちゃけ、こんな処理はforeachとかを使ったほうが簡単でわかりやすく実装できますが、Cakephpチュートリアルでは、Collectionクラスがあることを学ぶためにわざわざ使っているんだと思います。ちなみに自分は一度もColletionクラス使ったことないですね...。

あと、マニュアルに詳細が載っています。ただし、まだ日本語訳されていないので、英語のみです。

投稿2016/10/12 02:35

編集2016/10/12 02:40
popobot

総合スコア6586

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

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

blossan

2016/10/12 03:06

カンマ区切りの一つの文字列に変換する処理というのは、どのような処理でしょうか? [a],[b],[c]⇒[a,b,c]というイメージでしょうか? 私は入力する時に、,区切りでタグを入力していたので、一つの文字列にすると、タグテーブルに保存する時に不便だとイメージしていたので、少し驚いています。 ちなみに、この_getTagStringとは、どのタイミングで呼ばれるのでしょうか? また、、_getTagStringと、前に「_」とついているのは、private のような適用範囲を設定している意味であっていますか?
popobot

2016/10/12 03:22 編集

> [a],[b],[c]⇒[a,b,c]というイメージでしょうか? そういうイメージです。 > ちなみに、この_getTagStringとは、どのタイミングで呼ばれるのでしょうか? チュートリアルに書いてありますが、$bookmark->tag_stringでアクセスするとこの関数が実行されて、カンマ区切りで文字列になった値が取得できると思います。 > また、、_getTagStringと、前に「_」とついているのは、private のような適用範囲を設定している意味であっていますか? これはprotectedな関数ですね。protectedな関数に「_」をつけることはぷろじぇくとによってはあります。別に必須ではないですが、Entityにget系の関数を追加するときはそうしないと行けないのがCakeの規約です。なお、privateな関数は「__」をつけるというのがよくあります。
blossan

2016/10/12 03:20

丁寧な解説ありがとうございます。
popobot

2016/10/12 03:26

1点補足 > 私は入力する時に、,区切りでタグを入力していたので、一つの文字列にすると、タグテーブルに保存する時に不便だとイメージしていたので、少し驚いています。 保存するときには別のbeforeSaveの処理でタグ区切りの文字列をもとの配列に戻す処理がありますので、実際には配列にして保存しています。 http://book.cakephp.org/3.0/ja/tutorials-and-examples/bookmarks/part-two.html#id11 カンマ区切りの文字列を生成する理由は、表示するときに配列だと不便なので、Entityで文字列に置き換えたものをビュー側で簡単に取得できるようにするためです。 また、カンマ区切りの文字列で入力されたときも同様にタグを保存できるようにもしています。
blossan

2016/10/12 03:58

補足ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問