カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

PHPでJSON形式のデータを簡単に扱う

PHPにはJSON形式のデータを簡単に扱える関数が用意されています。
PHP5.2.0以降であればコアに含まれるので追加インストールの必要はありません。

例として会員システムで登録ユーザーの最終ログイン日とログイン回数を記録するというプログラムとします。

まずは以下のようなサンプル配列を作成します。

$VALUE["suzuki"]    = array("last_login_date" => "13-10-26", "count" => 1);
$VALUE["hashimoto"] = array("last_login_date" => "13-10-28", "count" => 5);

確認のため、出力してみます。

Array
(
    [suzuki] => Array
        (
            [last_login_date] => 13-10-26
            [count] => 1
        )

    [hashimoto] => Array
        (
            [last_login_date] => 13-10-28
            [count] => 5
        )

)

作成した配列を引数として渡し、JSONデータを作成します。

$json = json_encode($VALUE);

出力してみましょう。

{"suzuki":{"last_login_date":"13-10-26","count":1},"hashimoto":{"last_login_date":"13-10-28","count":5}}

たったこれだけでJSONデータが作成できます。

次はデータに変更を加えてみます。 続きを読む…»

9,204 views

ルート検索 最適経路

営業の仕事をしていると、複数の場所を効率よく回りたい、という要求が出てくるかと思います。
GoogleMap APIを利用すれば出発地点、到着地点、8ヶ所の経由地を指定し、効率よく回るルートを検索することができます。
所謂巡回セールスマン問題を踏まえた結果を返してくれます。
その際はリクエストプロパティの「optimizeWaypoints」にtrueを設定しておきます。

しかし、経由地8ヶ所以上の検索はできません。
費用が発生してよいならば、23ヶ所まで検索できるようです。
では、費用をかけずに8ヶ所以上検索したい場合はどうしたらよいでしょうか?

どうにか自前でできないかと色々調べました。
巡回セールスマン問題、組み合わせ最適化、パス表現法、ナップサック問題、欲張り法、遺伝的アルゴリズム等々。

巡回セールスマン問題、組み合わせ最適化を踏まえた最適ルートの検索で、何通りのルートを計測すればいいかと言いますと、以下の通り

n!/2n

nを10とすると(10×9×8×7×6×5×4×3×2×1)÷(2×10)で181,440通りとなります。

更にnが増加すると莫大な計算量になってしまうので、日常のプログラムとして使用するには
現実的ではありませんし、スーパーコンピューターでも100億年かかるという計算量になってしまいます。

…無理です。。。

何か打開策はないかと、物理の仕事(仕事率)も応用してみようと試みましたが、力(N)に当たるものが
ないので、比較する値としては単純な速さとなってしまうので最適な結果は得られず断念。

最終的に、遺伝的アルゴリズムを見ていると、ルートをランダムに作成するしかないのか、
という結論に至り、研究は終了しました。

というわけで、PHPとJavaScriptを使いプログラムを作成しました。

続きを読む…»

9,065 views

配列をランダムに並べ替える

PHPではshuffle関数を使って、配列の値をランダムに並べ替えることができます。

例として1から15の配列を作成し、配列の要素数だけ繰り返しランダムに並べ替えたものを表示しています。

<?php

$num_list = range(1, 15);

$n = count($num_list);

for($i = 0; $i < $n; $i++) {
    shuffle($num_list);
    echo @implode(", ", $num_list)."<br>";
}

?>

実行した結果がこちら
random_array

1,119 views

GoogleMapで距離計測(v3)

Google Maps Javascript APIを利用して2点間の距離と、移動にかかる所要時間を計測します。
計測にはgoogle.maps.DirectionsServiceクラスを使用します。
基本はGoogleMap ルート検索と同じです。

リクエスト用のプロパティクラスを作成します。

var request = {
    origin: null,      //出発地点のLatLngオブジェクト
    destination: null, //到着地点のLatLngオブジェクト

    //DRIVING=自動車,BICYCLING=自転車,TRANSIT=電車,WALKING=徒歩
    travelMode: google.maps.DirectionsTravelMode.DRIVING,

    avoidHighways: false,
    //trueの場合、ルートサービスで可能な場合は高速道路を避けるように指示します。省略可能

    avoidTolls: false,
    //true の場合、ルート サービスで可能な場合は有料道路を避けるように指示します。省略可能

    provideRouteAlternatives: false,
    //代替ルートを提供するかどうかを指定します。省略可能

    unitSystem: google.maps.UnitSystem.METRIC
    //距離を表示する際に使用される優先単位系。デフォルトは出発地点の国で使用される単位系。
    //IMPERIAL=距離をヤード法の単位で表す。METRIC=の距離をメートル法の単位で表す。
};

DirectionsServiceのインスタンスを生成

var directionsService = new google.maps.DirectionsService();

出発地点と到着地点を設定します。

request.origin      = new google.maps.LatLng(34.73307796637832, 135.49859046936035);  //新大阪駅
request.destination = new google.maps.LatLng(35.681003987351055, 139.76703643798828); //東京駅

続きを読む…»

8,899 views

GoogleMapで面積計測(v3)

GoogleMapを利用し、図形を描画して囲った部分の面積を求めることができます。
ネットで探しましたが、バージョン3で組まれたものが見当たらなかったので書いておきます。

計測にはというジオメトリライブラリのユーティリティ関数(google.maps.geometry.spherical)を使用します。

コードはGoogleMapオブジェクト(map)は既に作成済のものとして書いています。
ついでに、距離も計測できるようにしています。
ご参考になれば幸いです。

ちなみに、某メーカーの住宅地図ソフトでの面積計測と精度は変わりませんでした。

GoogleMapAPI version 3.21

PolygonOptionsクラス

var myPolygonOptions = {
    clickable: false,       // クリックイベントの有効/無効
    fillColor: "#ffffff",   // 塗り潰し色
    fillOpacity: 0.6,       // 塗り潰しの不透明度(0.0-1.0)
    map: map,               // GoogleMapのインスタンス
    paths: new Array(),     // 座標の配列
    strokeColor: "#000000", // 線の色
    strokeOpacity: 0.8,     // 線の不透明度(0.0-1.0)
    strokeWeight: 3         // 線の太さ(ピクセル)
}

続きを読む…»

4,395 views