hnwの日記

PHP

自然順ソートを行うPHPワンライナー

PHP

PHPの豊富すぎる組み込みの関数の中でも、natsort関数はかなり高機能な関数の一つだと思います。他の言語なら本体に組み込まれることは有り得ないのではないでしょうか。 natsort ― "自然順"アルゴリズムで配列をソートする 説明 bool natsort ( array &$arr…

ワンライナーのためのPHPコマンドラインオプション

PHP

ワンライナー(1行スクリプト)の代名詞と言えばPerlでしょう*1。Perlにはワンライナー向けのコマンドラインオプションが多数用意されています。中でも-neオプションや-peオプションは強力で、入力行ごとの処理をループを使わずに簡潔に記述できます。Perlの…

pearコマンドのキャッシュと仲良くなる

PHP

openpearってプログラマ視点で非常に素晴らしいですよね。自分のライブラリをPEARパッケージにすると他のマシンにインストールするのが楽になるので、個人レベルでもコードの再利用が進むと思います。大人数で使うようなものなら尚更メリットは大きいと思い…

見直されるべきPHP5の組み込みイテレータ

PHP

PHPには5.0.0以降SPL (Standard PHP Libray)という枠組みが導入されています。これにより、Iteratorインターフェースを実装したクラスのインスタンスであれば、foreach文で配列と同じように取り扱えます。自分でクラスを作るときもIteratorを実装すれば使う…

array_unique関数がPHP5.2.10から後方互換性を取り戻します

PHP

「array_unique関数がPHP5.2.9から後方互換性を失いました」の内容について、PHPの中の人も認識を改めたようです。次のようなタレコミがありました。 【速報】「sort()関数は相当おかしい」と PHP 開発者を訴えていた問題で、原告の hnw さんが最高裁で勝訴…

関数に見えて実は言語構造であるようなPHPキーワード一覧

PHP

追記(2009/05/10 09:25):何をもって「関数に見える」かは人によると思いますが、下記のリストはリファレンスマニュアルのURLがfunction.*.phpとなっているものを引っ張ってきました。 PHPには一見関数に見えるけど関数ではないキーワードが多く存在します…

UTF-8→SJIS/EUC-JPの重複文字をまとめてみた

PHP

文字エンコーディングの変換を行うと、異なる2文字が同じ文字に変換されることがあります。このような文字を重複文字と呼ぶことにします。UTF-8→Shift_JISおよびUTF-8→EUC-JPについて、重複文字を自分用の資料としてまとめてみました。 MacOSX上のPHP5.2.9で…

Text_VariationProducerの紹介

PHP

Text_VariationProducerというPHPのクラスを作りましたので、紹介します。 Text_VariationProducerは、指定した全組み合わせの文字列を作り出すようなイテレータです。n重ループや分岐を書く代わりに、文字列の組み合わせパターンを簡単な文法で記述するだけ…

Suhosinの野良portsを作った

PHP

MacportsでSuhosinが入れられるように、githubに野良Portsを作りました。怪しい英語で説明も書いてみました:http://wiki.github.com/hnw/macports-repos-hnw Suhosinというのは「なぜSuhosinを使うのか」でも紹介しましたが、PHPのセキュリティレベル向上の…

PHPの==演算子をわかりやすくするパッチ

PHP

「PHPの==がキモい件」でも書きましたが、PHPの==は数値っぽいものに対してアバウトな比較を行う演算子です。一方で、他の言語の==演算子は正確な比較を行うものばかりだと思います。他の言語の経験者がPHPのソースコードを読み書きする場合に、PHPの==演算…

巨大なSJISのCSVファイルをfgetcsv関数で処理する

PHP

さて、前回記事「PHPでメモリ上に一時ファイルを作る」では、file_get_contents関数でCSVファイル全体を取得して文字エンコーディングの変換を行い、変換結果に対してfgetcsv関数を利用しました。しかし、CSVファイルが巨大な場合にはfile_get_contentsを使…

PHPでメモリ上に一時ファイルを作る

PHP

「blog.plastik.jp » PHP5 の fgetcsv() で読み込み内容が腐る現象」という記事を読みました。fgetcsv()だとSJISのCSVファイルがうまく読めないので、UTF-8に直してテンポラリファイルに保存してfgetcsvで読み込む、という筋書きのようです。 ちゃんとtmpfil…

array_unique関数がPHP5.2.9から後方互換性を失いました

PHP

追記(2009/06/26):PHP 5.2.10以降、この問題は修正されています。「array_unique関数がPHP5.2.10から後方互換性を取り戻します」も併せてご覧ください。 2/26にPHP5.2.9がリリースされましたが、このバージョンからarray_unique関数が後方互換性を失いま…

PHPのsort関数は相当おかしい

PHP

追記(2009/02/28 15:35):ソートする配列の要素が数値または数値形式の文字列のみの場合は、が推移律を満たすので、この記事のような矛盾は起こりません。念のため。オヤジギャグがこらえられなくなったら立派なオヤジだと思います。それはさておき、今日…

mb_ereg系の関数でUTF-16を扱う方法

PHP

PHPでmb_regex_encoding("UTF-16")すると、一見mb_ereg系関数が期待通りに動きません。

PHPでマルチバイト対応のtrim関数を作る

PHP

(2009/06/29)追記4:本記事のmb_trim関数が動かない環境があったので、詳細を「PCREはUnicode文字プロパティをサポートするとは限らない」にまとめました。よりポータブルなmb_trim関数も紹介していますので、併せてご覧ください。 追記:「mb_ereg_match(…

mb_check_encodingは何をチェックするのか(その3 UTF-8編)

PHP

(2009/10/05追記)「サロゲートペアに相当する3バイト表現も正しいとみなしている」という件はバグとしてPHP5.3.0から修正されているようです。id:moriyoshiさんに超感謝。 PHPのmb_check_encoding関数の調査、おそらく今回が最終回です。今回はUTF-8につい…

mb_check_encodingは何をチェックするのか(その2 EUC-JP編)

PHP

前回に引き続き、PHPのmb_check_encoding関数について調べてみます。今回はEUC-JP、eucJP-win、CP51932の3つについて調べてみました。

mb_check_encodingは何をチェックするのか(その1 SJIS編)

PHP

(2009/02/15 17:20)「個人的な感想」を追記しました。また、下記はPHP5.2.1以降の挙動です。PHP5.2.0以前のmb_check_encodingは更にカオスなので、あまり使い物にならないと思います。 (2009/02/16 12:30)追記2:バグっぽいと思った件は本当にバグで、修正が…

PHPとRubyとPythonのparserをいじめてみた

PHP

下記のようなプログラムを与えると、PHPのparserが「無理っす」と言って死にます。

array_unique関数の重複の意味に注意

PHP

僕は滅多に使わないのですが、PHPにはarray_uniqueという関数があります。 array_unique ― 配列から重複した値を削除する 説明 array array_unique ( array $array [, int $sort_flags ] ) array を入力とし、値に重複のない新規配列を返します。 PHP: array…

PHPで==の代わりにstrcmp関数を使うことによる問題点

PHP

補足(2010/12/01 03:00):floatからstringへのキャストで丸められる桁数についてですが、php.iniの設定値「precision」の影響を受けるようです。 僕は以前から「PHPの==はキモいから===を使おうよ」と言っているつもりです(参考:「PHPの==がキモい件」)。…

phpallコマンドでPHPの全バージョンの挙動を試す

PHP

追記:1/13頃まで、install-all-php.shにバグがありました。ごめんなさい。今は全バージョンを一気にコンパイルできるはずです。 第38回PHP勉強会でも紹介しましたが、私はPHP5.0.0〜PHP5.2.8までの全バージョンのPHPバイナリを持っています。これはPHPのバ…

なぜSuhosinを使うのか

PHP

Suhosinプロジェクトのドキュメント「Suhosin - Why ?」を日本語訳してみました。慣れた方の翻訳とはかけ離れた出来だと思います。というのも、日本語として自然な言い回しに変えようとした部分があり、翻訳としては少々問題があるかもしれません。また、僕…

strtotime関数との付き合い方

PHP

PHPで日付・時刻の処理を書く際、「strtotime()関数を使うと可読性が高くなって良い」と僕は思っていたのですが、全面的に信用するのは危険だと感じてきました。 strtotimeというのは、文字列をunix timeに変換する関数です。「2008-12-24 23:59:59」のよう…

第38回PHP勉強会に参加してきました

PHP

第38回PHP勉強会に参加して、5分ほどLTをしました。勉強会の会場はトライコーン株式会社さんにお貸し頂きました。ありがとうございます。 発表資料:「PHPの全バージョンを揃えよう」(PDF) Ustream録画:http://www.ustream.tv/recorded/989155 (5:54) という…

PHPの浮動小数点数の表示

PHPのround関数のリファレンスマニュアルのページに面白いコメントを見つけたので紹介します。

PHP5.2.7のround関数の実装もPHP5.2.6と変わった

題名の通り、PHP5.2.7でround関数の実装が変更されました。12月8日付でPHP5.2.8がリリースされましたが、round関数についてはPHP5.2.7と同一です。 概要 ますがたさんの記事で既報ですが、bugs #42294に関してPHP5.2.7で修正が入り、round関数の実装が変わり…

PHP5.3.0alpha3のround関数の実装がPHP5.2.6と変わった

(2016/07/02 20:00追記)本稿をさらに掘り下げた記事「PHPのround関数を読み解く (1)丸め桁数が大きすぎ・小さすぎる場合」「PHPの新しいround関数を読み解く (2)pre-roundingの意味」を書きました。合わせてご確認ください。 12月4日付でPHP5.2.7とPHP5.3.0a…

CakePHPカンファレンス東京に行ってきました

PHP

土曜日に開催されたCakePHPカンファレンス東京に、CakePHPに触った事もないのに行ってきました。CakePHPの中の人であるGarrettの話が聞けて良かったですね。 Garrettの話で印象深かったのは、CakePHPはバグチケット数を0にしてからじゃないとリリースしない…