phpのarray_columnやばい

配列のあるキーを使って構造を変更することが簡単に出来るようになるarray_column(PHP5.5以上)
http://php.net/manual/ja/function.array-column.php

説明
array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

array_column() は、 配列 input の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。これを指定すると、 入力配列内のカラム index_key の値に基づいて結果を並べ替えます。
-- PHPマニュアルより引用

説明読んでもイメージがわかねぇ…

そこで例を見てみる。
下記例はPHPマニュアルより引用。

例1 レコードセットからのファーストネームの取得

<?php
// データベースから返ってきたレコードセットの例
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);

$first_names = array_column($records, 'first_name');
print_r($first_names);
?>

上の例の出力は以下となります。

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

簡単にfirst_nameの別配列が作れる。

例2 レコードセットから姓を取得し、”id”で並べ替える例

<?php
// 先ほどの例と同じ $records 配列を使います
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
?>

上の例の出力は以下となります。

Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)

id => last_name で配列を作成出来た。

PHPマニュアルの例には出てないが、第2引数をnullにすると、第3引数の値を元になる配列全体のキーにして返してくれる。

$ids = array_column($records, null, 'id');
print_r($ids);
?>

上の例の出力は以下。

array(
    2135 => 
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    3245 =>
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    5342 =>
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    5623 =>
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
)

DBから取ってきたデータの整形あたりでよく使えそう…特に例2はもっと早くこれを知っておけば使えた場面があったように思える…。

教訓

マニュアルやバージョン差分は目を通しましょう。

PHP で var_dumpのフォーマット

var_dumpデバッグしすぎ問題

複数のvar_dumpを出力させてどこに書き込んだか分からなくなった、なんてことないだろうか? (俺だけ?)

で、var_dump でデバッグしたいとき、こんな感じのフォーマットで設定しておく。

/**
 * 下記のフォーマットで書くと出力はこうなる
 * ExecFile: 呼び出したファイル名(行数)
 * Function: 呼び出した関数名
 * 値
 */
var_dump('ExecFile: '.basename(__FILE__).'('.__LINE__.')', 'FUNCTION: '.__FUNCTION__, variable, variable,...);
// var_dump は引数をカンマ区切りで無制限に渡せる。

Sublime Text 3 での Snippet設定

Sublime Text 3 のSnippetは下記設定例。
“var” を入力すると上記のスニペットが展開できるようになる。

ファイル名: var_dump.sublime-snippet

<snippet>
    <content><![CDATA[var_dump('ExecFile: '.basename(__FILE__).'('.__LINE__.')', 'FUNCTION: '.__FUNCTION__, ${1:variable});]]></content>
    <tabTrigger>var</tabTrigger>
    <scope>source.php</scope>
    <description>var_dump Debug</description>
</snippet>

PhalconでPHPビルトインサーバー時にドハマり

Phalcon を使ってみた

Phalconは「A full-stack PHP framework delivered as a C-extension」というフレームワークです。
ベンチマークで超絶速度(PHPフレームワークにおいて)をたたき出すポテンシャルを持っています。
Phalcon 公式はこちら

Phalcon、PHPビルトインサーバーでも動作するってよ

Phalconの公式ドキュメントはかなり詳細なことまで書かれています。
もちろん、サーバー設定方法まで丁寧に記載されています。

で、PHP5.4から搭載されたPHPビルトインサーバーの設定も書かれていました。
PHP ビルトインサーバーの利用

この設定は .htrouter.php というファイル(.htaccess的なもの)で、これを行わないとPhalconのデフォルトと同一の設定になりません。

<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;

このファイルを使用してサーバーを起動

php -S localhost:8000 -t /public .htrouter.php

これで.htrouter.phpを使用してサーバーへアクセするようになります。

ところがどっこい

さて、これを使用していたもののタイトル通りにここではまってしまいました。
例えばGETにクエリ(パラメーター、Query String…等呼ばれ方はいろいろ)を付与し “/foo/bar?baz=qux” というURLへアクセスすると、ルーティングが上手く動作しなくなります。

変数などをダンプしてみると、
“bar?baz=qux” という文字列がルーティングの判定時に使われています。
本来この時点で取得しなければいけないのは “bar” という文字列だけです。

Phalconのルーティングは、ControllerクラスのActionと呼ばれる関数を使用して動的に呼び出しています。
上記の場合、bar?baz=quxAction()みたいな呼ばれ方をしてしまうということです。
本当はbarAction()を呼ばなければならない。

ならば正せばいい

実際のところ、このことが全く分からず(むしろ勝手にクエリストリングが分割されると思い込んでいたのも問題だった)、1日ハマって見つけたサイトがこちら。
Route not matches URI with querystring · Issue #379 · phalcon/cphalcon
ハイ、公式のgithubのissuesでした。

このissueを読んで上記のルーティングの仕組みをやっと理解。
出来上がった .htrouter.php はこちら

<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    if (!empty($_SERVER['REQUEST_URI'])) {
       $uriParts = explode('?', $_SERVER['REQUEST_URI']);
       $uri = $uriParts[0];
    } else {
       $uri = '/';
    }
    $_GET['_url'] = $uri;
}

return false;

このポイントの記事が全く見つからず、きっとPHP ビルトインサーバーをみんなが使ってないだけ俺の知識が浅いんじゃないうんきっとそうに違いない。と自己弁護しつつPhalconライフをお楽しみたいと思います。

追伸: 実はvar_dumpで$_GETとかを見ていればヒントがあった。困ったときはvar_dump。

Sublime Text 3 のPHP系プラグイン覚え書き

自分が使用しているSublime Text 3 の PHP向けのプラグインメモ。
随時追加していく予定。

Windows Application

Sublime Text とは関係ないけど、PHPerは使用できるようにしておいた方がいいと思われるアプリケーション。

Composer

PHP界隈では必須になりつつあるPEARに変わるライブラリ管理ツール。

  • インストール 公式サイト: Composer
  • 下記パスを環境変数に追加
    ※追加しないとcomposerでインストールしたものがパス無しで実行できない
%USERPROFILE%AppDataRoamingComposervendorbin

登録するコマンドは下記

composer config -g repositories.packagist composer http://packagist.jp

完了

Sublime Text 3 Plugins

SublimeLinter

SublimeLinter-phpcs

コマンドラインツールのPHP CodeSnifferを使用するとコーディング規約をチェックしてエラーを表示してくれる

  • コマンドラインツールのインストール
composer global require squizlabs/php_codesniffer=*

SublimeLinter-phpmd

コマンドラインツールのPHP Mess Detectorを使用するとプログラムで怪しいところをチェックしてエラーを表示してくれる

  • コマンドラインツールのインストール
composer global require phpmd/phpmd=*

Sublime Text 2にPHPのCodeSnifferを追加。

PHPをPSR規約に準拠して書こうと思い立ったのでいくつかの規約を自分で選んで準拠チェックが出来るCodeSnifferを追加した。
このプラグインは他にもいくつか機能があり、自分はPSR準拠にフォーマットしてくれる機能も設定している。
プラグインはsublime-phpcs
プラグインの詳細はこちら

プラグインのインストールはいつも通りPackage Controlなので割愛。

このプラグインはPearのPHP_CodeSnifferライブラリが必要なので下記のコマンドで導入。

pear channel-update pear.php.net
pear clear-cache
pear install PHP_CodeSniffer

※1行目と2行目は念のため。

ついでにPSR準拠のソースに自動で変換してくれるPHP Coding Standards Fixerも使う。
これはsublime-phpcsのオプションとして対応している。
使用するためにはPHP Coding Standards Fixer本体ファイルが必要なので下記から導入。
PHP Coding Standards Fixer
これを適当な場所に置く。
自分はsublime Text 2のDataPackagesUser配下に設置。

追記(2013-08-03 17:44): どうやら以前書いたものは使えなくなったみたい。
どこかのアップデート時にsettingが変わったようで、新しいものにしないと動かなくなったので気づいた。
現在はExampleとして
DataPackagesPhpcsexample-settings
にファイルが入っているのでそれを使った方が無難。

ユーザー設定は下記。参考程度にどうぞ。
設定するうえで必須なのはphp_cs_fixer_executable_path。
このパスはコマンドラインへそのまま渡すので”php “から書かないと動かないので要注意。

{
    // Execute the sniffer on file save
    "phpcs_execute_on_save": false,

    // PHP_CodeSniffer settings

    // Additional arguments you can specify into the application
    //
    // Example:
    // {
    //     "--standard": "PEAR",
    //     "-n"
    // }
    "phpcs_additional_args": {
        "--standard": "PSR2",
        "-n": ""
    },


    // Show the errors in the quick panel so you can then goto line
    "phpcs_show_quick_panel": false,

    // PHP-CS-Fixer settings

    // Fix the issues on save
    "php_cs_fixer_on_save": false,

    // Show the quick panel
    "php_cs_fixer_show_quick_panel": true,

    // Path to where you have the php-cs-fixer installed
    "php_cs_fixer_executable_path": "php "Sublime Text 2インストールパス\Data\Packages\User\php-cs-fixer.phar"",

    // Additional arguments you can specify into the application
    //
    // Example:
    // {
    //     "--level": "all"
    // }
    "php_cs_fixer_additional_args": {
        "--level": "psr2"
    },


    // PHP Linter settings

    // Are we going to run php -l over the file?
    "phpcs_linter_run": false

}