[PHP]json_decode した stdClass Object を扱う

stdClass Object
(
    ["sample"] => stdClass Object
        (
            ["color"] => red
        )

    ["0"] => stdClass Object
        (
            ["color"] => green
        )

)

json_decode をすると第2引数を指定しない限り上のようになることがあります。
sample の color を取り出すなら、「$foo->sample->color」で良いのですが、
[0] のほうを取り出そうとして「$foo->0->color」とやってもエラーになります。
かといって $foo->item(0) みたいなものがあるわけでもないようなので、
素直に Array にキャストするのが普通ですが、もし強引にそのまま扱いたいのであれば

$foo->{'0'}->color

のようにすればとりあえず取れます。

とは言え扱いにくいので json_decode($foo, true) として連想配列にしておいたほうがいいと思います。


2012/11/24 追記:
この方法はキーがString型の場合のみ使用できます。

[PHP]複合名詞に対応させて分かち書きをする

今回も igo-php を用いた形態素解析のサンプルなので、導入については こちら を御覧ください。

通常分かち書きをする場合、名詞は細かく分割され、次のように解釈されます。

「これは形態素解析の実験結果です。」 → 「これ | は | 形態素 | 解析 | の | 実験 | 結果 | です | 。」

もちろん間違ってはいないのですが、感覚的には「形態素解析」「実験結果」はそれぞれひとつの単語でまとめられていたほうが自然です。
「東京特許許可局」などの場合も同様に一つの単語として扱うことがほとんどです。

法則を見てみると、名詞が連続している場合は複合名詞になるというシンプルなものなので、
それを踏まえて次のようにしてみました。

<?php
require_once 'lib/Igo.php';

$igo = new Igo(dirname(__FILE__) . "/ipadic", "UTF-8");
$str = "これは形態素解析の実験結果です。";
$result = $igo->parse($str);

$noun = "";
$words = array();
foreach($result as $value){
  $feature = explode(",", $value->feature);
  if($feature[0] === "名詞"){
    $noun .= $value->surface;
  } else {
    if(mb_strlen($noun)) $words[] = $noun;
    $noun = "";
    $words[] = $value->surface;
  }
}
if(mb_strlen($noun)) $words[] = $noun;
print_r($words);

結果: 「これ | は | 形態素解析 | の | 実験結果 | です | 。」

名詞が現れた場合は一旦 $noun に保管しておき、その他の場合は単語として $words に追加します。
連続して名詞が現れた場合は $noun に追加します。

[PHP]漢字をひらがなに変換する

前回 igo-php を用いた形態素解析について述べたので、
今回はそちらを使って漢字を含む文章をひらがなに変換するプログラムを作ってみます。

<?php
require_once 'lib/Igo.php';

$igo = new Igo(dirname(__FILE__) . "/ipadic");
$text = "漢字は、古代中国に発祥を持つ文字。特に中国語を表記するための文字である。";

$result = $igo->parse($text);
$str = "";
foreach($result as $value){
	 $feature = explode(",", $value->feature);
	 $str .= isset($feature[7]) ? $feature[7] : $value->surface;
}
echo mb_convert_kana($str, "c", "utf-8");

結果:
かんじは、こだいちゅうごくにはっしょうをもつもじ。とくにちゅうごくごをひょうきするためのもじである。

parse() されたテキストの読みがなは、feature 内のカンマ区切りされた8番目にあるので、
それを繋げば読みがなをつけることができます。
feature の読みはカタカナで書かれているので最後に全てひらがなに統一してあります。