読者です 読者をやめる 読者になる 読者になる

UNIX的なアレ

UNIX的なこととかいろいろ

set::combineはなかなか便利だ

CakePHP PHP

CakePHPで、findした結果をidをキーにして配列にしなおすという作業は割とやる作業かと思います。普通にループさせて組むと以下のような感じでしょうか。テーブルは下記のような感じで。

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| data  | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

コードはここから。

<?php
$posts = $this->Post->find('all');
foreach ($posts as $post)
    $data[$post['Post']['id']] = $post['Post']['data'] ;

まぁこれでも良いのですが、CakePHPにはset::combineという関数が用意されています。上記のコードを以下のように書き直すことができました。

<?php
$posts = $this->Post->find('all');
$data  = set::combine($posts,'{n}.Post.id','{n}.Post.data');

{n}は渡ってきた配列のキーを指定しているようですね。foreachを使うよりも、こっちの方がコードの見通しがよくてすっきりしますね。

追記

上記の例だとfind('list') でもできるよ!とツッコミが入ったので追記です。確かにそうでした!find('list')を使うとこんな感じですね。

<?php
$data = $this->Post->find('list',array('fields'=>array('Post.data')));