PHP関数とsymfonyでためになったこと

こんばんは。
ブログのネタが切れ気味の笹亀です。

人は、普段から意識していないとなかなか思い出したりすることや、使用することって難しいですよね。少なからず私は難しいとおもってます。

プログラムでも同じことが言えると思います。
PHPの関数やsymfonyの機能を思い出そうとしても「あの機能ってどうやるんだっけ?」とか思い出すことがなかなかできないことがあります。

そういうことに出会って時に自分が心がけていることがメモを残したり、ブログなどに書いて忘れないようにすることが必要です。
ということで、今回はわたしがPHPやsymfony機能を教えてもらってり、調べてみたときに「そんなこともできるんだ〜」とか「忘れてたよ」とか「便利だなぁ」思ったことをいくつかまとめてみました。
※ご存知の方はごめんなさい;;

まずはPHPの関数で便利な使い方ができるものを紹介します。

・「print_r」関数の第2引数にtrueを与えると出力した内容を文字列で取得できる。
サンプル


<?php
$points = array();
$points[] = array('latitude' => 35707701,'longitude' => 139761787,'iconid' => 17);
$points[] = array('latitude' => 35706847,'longitude' => 139762618,'iconid' => 18);
$points[] = array('latitude' => 35706764,'longitude' => 139762515,'iconid' => 19);
$string = print_r($points,true);
print "<pre>";
print $string;
?>

実行結果

私がよく使用する箇所としては、エラー処理や例外処理のときに変数の中身のデバックしたいときなど、エラーメールとして本文に貼付けるときなどに使用しています。
 ※PHP 4.3.0以降のバージョンでしか使用できませんのでご注意ください。

・「scandir」関数
PHP5から追加された関数で、指定したフォルダ内のファイルをリストで取得する関数です。
私は、この関数の存在に気づかずにいつも下記のように面倒な方法で取得していました。


<?php
$dir = "/data/tmp/files";
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    $files[] = $filename;
}
?>

 ※PHP 5.0.0以降

次にsymfony編です。

・「sfLoader::loadHelpers」でアクション内でもヘルパーを使用する方法

ヘルパーでは定義しているけど、アクション内でも同じ処理を行いたいと思って、
そんな便利なものがないかと聞いてみたときに教えてもらいました^^

注意点として上位のヘルパーに互換性がある場合は、ちゃんとそのヘルパーも呼び出さないとエラーになります。


例えば、Formヘルパーをアクション内で使う場合は
×:sfLoader::loadHelpers(array('Form'));
○:sfLoader::loadHelpers(array('Helper','Tag','Form'));
としてから呼び出すことができます。

最後にsymfony Doctrine編です。

・DQL(DoctrineQueryLangage)を実行することで生成されたCollectionデータの配列のキーを特定のフィールドで指定する方法

下記のサンプルのように記述して取得できます。

例)ランキングのデータ(UserRankking)をランクフィールド(rank_number)をキーとしてCollection配列を取得する
3-1の1位〜100位までを取得


 $table = Doctrine::getTable('UserRankking');
 $table->setAttribute(Doctrine::ATTR_COLL_KEY, 'rank_number');
 $ranks = $table->createQuery()
    ->where('class_id = ?', '3-1'))
    ->addWhere('edition_number >= ? AND edition_number <= ?', array(1, 100))
    ->orderBy('rank_number asc')
    ->execute();

上記のように特定のフィールドの値をキーにしてCollectionデータの連想配列として$ranks[1],$ranks[2],$ranks[3],$ranks[4]...のようにCollectionデータを取得できます。
しかし、指定したフィールドの値(連想配列のキー)がユニークでない場合は上書きされてしまうので、使用する場合には注意が必要です。
 ※setAttributeでセットしない場合は、0からのキーで開始されます。

皆さんもこういったTipsや為になったことなどはないでしょうか?
そんなときには是非、私にも教えていただき、情報共有ができたらとてもうれしいです^^

最後になりましたが、本日書かせていただいたことが皆さんの少しでもお役にたてれば幸いです。