PHP foreachで破壊的に配列を書き換え

PHPで, foreachのループで配列を書き換えたい (破壊的な処理をしたい) 場合がある.

<?php
    $values = [
        'one'    => ['a', 'b', 'c'],
        'two'    => ['a', 'b', 'c'],
        'three' => ['a', 'b', 'c]
    ];

    foreach ($values as $value) {
        foreach ($value as $k => $v) {
            $value[$k] = strtoupper($v);
        }
    }

    var_dump($values);  //小文字のまま…

しかし, ループ各要素の値を操作して格納しても, 元の配列の値自体は変わらない. これは, ループ時に各要素のコピーを生成していることに起因していると思われる.

したがって, ループの各要素の参照にアクセスするようにする

 

<?php
    $values = [
        'one'    => ['a', 'b', 'c'],
        'two'    => ['a', 'b', 'c'],
        'three' => ['a', 'b', 'c]
    ];

    foreach ($values as &$value) {
        foreach ($value as $k => $v) {
            $value[$k] = strtoupper($v);
        }
    }

    var_dump($values);  //大文字に変わっている

Google Chartsによる棒グラフの描画

Google Chartsを利用して棒グラフを描画するスクリプトを作成してみました.

ポイントはデータとなる配列の構造で, 棒グラフの場合は, [[‘項目’, ‘項目’, …], [number, number , …]] の (2次元) 配列となるようにします.

あと, ページロード時に描画する場合には, setOnLoadCallbackに描画のための関数を指定します.

また, オプションはwidth / heightなど以外にもたくさんあります. さらに,イベントハンドラの設定も可能です. 詳細はAPIのページを参照してください.

Google Chartsによる円グラフの描画

Google Chartsを利用して円グラフを描画するスクリプトを作成してみました.

ポイントはデータとなる配列の構造で, 円グラフの場合は, [[‘項目’, number], [‘項目’, number], …] の (2次元) 配列となるようにします.

あと, ページロード時に描画する場合には, setOnLoadCallbackに描画のための関数を指定します.

また, オプションはwidth / heightなど以外にもたくさんあります. さらに,イベントハンドラの設定も可能です. 詳細はAPIのページを参照してください.

PHP stream_context_create

stream_context_create関数を利用すれば, PHPのスクリプトから, 別のサーバーサイドプログラムにHTTPリクエストを送ることが可能.

GETの場合

$options = [
    'http' => [
        'method' => 'GET',
        'header'  => "Accept-language: ja\r\n" .
                               "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($options);
$result    = file_get_contents('リクエストを送るURL', false, $context);

POSTの場合

$posts = 'post data';

$options = [
    'http' => [
        'method' => 'POST',
        'header'=>"Content-Type: application/x-www-form-urlencoded;\r\n" .
        "Content-Length: " . strlen($posts) . "\r\n",         'content' => $posts
   ] ]; $context = stream_context_create($options); $result = file_get_contents('リクエストを送るURL', false, $context);

Manual

Webサイトで数式を表示したい

Webサイトで数式を表示する方法はいくつかありますが, 今回はjQueryプラグインのjsLaTexを紹介.

1. 必要なモジュールを読み込み

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>  <!--jQuery-->
<script src="jquery.jslatex.js"></script>

 

2.  対象のjQueryオブジェクトのlatexメソッドを呼び出し

<script>
$(function () {
    $(".latex").latex();
});
</script>

3. HTMLはこんな感じ

<div class="latex">
    \int_{0}^{\pi}\frac{x^{4}\left(1-x\right)^{4}}{1+x^{2}}dx =\frac{22}{7}-\pi
</div>

簡単な仕組みとしては, LaTexで記述された数式を入力にして, Web APIにアクセスして, 画像として数式を表示しています.

LaTexが使える方なら, 最も簡単な方法ではないかなと思います.

Web Audio APIでConvolverNodeを使う

Web Audio APIのConvolverNodeでリバーブを利用するためには, インパルス応答のオーディオファイルが必要となりますが, Webで公開されているファイルを利用することになるのですが, 利用条件や著作権の関係から無償で自由に利用できるのは意外とありません.

そんな数少ないなかから, よさげなサイトを発見.

非商用利用であれば, 自分のサイトにおいてWebアプリに利用しても問題なさそうです.

http://legacy.spa.aalto.fi/projects/poririrs/

500 Internal Server Error の解決

500 Internal Server Errorが出る場合, 大抵は,

  • パーミッションの設定
  • スクリプトのエラー

のような気がする.

PHPの場合…

php.iniでdisplay_errorsをOffにしていると, このエラーの詳細がわからないのでなおさらはまりやすい. 仕方ないので, 一時的に, display_errorsをOffにして修正…

エラーページへ遷移させる

ページが見つからない (404 Not Found), アクセス禁止 (403 Forbidden) などの場合に, オリジナルのエラーページに遷移させたい場合, .htaccessに以下の形式でルールを記述する.

ErrorDocument {ステータスコード} {エラーページのパス}

例えば, 404 Not Foundのときは, こんな感じ.

ErrorDocument 400 http://hogehoge.jp/errors/e400.html

それに関連して, おもしろいリンク集を発見

http://kachibito.net/web-design/japanese-404-design.html

 

Mac OS Xでmod_rewrite

備忘録的に…

1 . まずは, mod_rewriteが入っているか念のため確認

Apacheの設定ファイル /private/etc/apache2/httpd.conf に以下の行があって, かつ, コメントアウトされていないか確認

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

2.  /private/etc/apache2/users/{ユーザ名}.conf に以下の記述を追加

<Directory /Users/{ユーザ名}/Sites>
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

mod_rewriteを機能させるうえで重要なのは,

Options Indexes MultiViews FollowSymLinks
AllowOverride All

この2行.

1つめは, Mac OS Xでは, /etcは, /private/etcへのシンボリックリンクとなっているので, それをたどるように指示している感じ.

2つめは, .htaccessの設定を優先しますよ〜的な指示.

最後に, mod_rewriteを有効にしたいディレクトリに.htaccessを置いて, mod_rewriteのルールを記述します. こんな感じです.

#mod_rewrite
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

このルールによって, htmlの拡張子をURLに含めずに,

HTMLファイルにアクセスすることが可能になります.