2008/10/21(火)
sort(Array, Flag) : ソート時、キーが再設定される
asort(Array, Flag) : ソート時、キーの値を保持
Tail-Lagoon @ 00:00
|
PageUp
2008/07/09(水)
なんとなく、作ってみた。ただし、コード中のコメントにも書いたとおり、接頭記号 978 だけでなく、979 が増えてきたら、たぶん無効になるのだろう。
ただ変換するだけなら既に WEB 上にそういうサービスはいくつも見つかる筈なので、わざわざこんなもの作る必要はないのだけれど、ちょっと自分のページの中で(amazon へのリンクを作成するために、当面の間だけでも)使いたかったので、PHP で書いてみた。……まだきちんと検証はしていないので、間違いがないとはいえない。
<?php
// ISBN10 のチェックディジットの算出
function ChkDgt10($nine) {
/* 計算方法
(1) 10桁コードの各桁の桁数(d)と値(Vd)の積の合計を求める(ただし d > 1)。
V10×10 + V9×9 + V8×8 + … + V2×2
(2) チェックディジット = 11 −((1)の答を 11 で割った剰余) となる。
ただし、求めた数字が 10 の場合は X とし、11 の場合は 0 とする。
*/
// $nine : チェックディジットを除いた9桁の数字
// $nine = trim(str_replace('-', '', $nine)); // この行は必要に応じて活殺
if (strlen($nine) === 9) {
$sum = 0;
for ($i = 0; $i < 9; $i ++) {
$dgt = 10 - $i; // 添字(オフセット)と桁数の関係
$sum += (int)$nine[$i] * $dgt;
}
$ChkDgt = 11 - ($sum % 11);
if ($ChkDgt === 10) $ChkDgt = 'X';
if ($ChkDgt === 11) $ChkDgt = '0';
return $ChkDgt;
} else {
return FALSE;
}
}
// ISBN13 のチェックディジットの算出
function ChkDgt13($twelve) {
/* 計算方法
(1) (13桁コードの左から奇数桁の数字の合計×1)と(偶数桁の数字の合計×3)の合計を求める。
(2) チェックディジット = 10 −((1)の答の下1桁の数字) となる。
ただし、求めた数字が 0 または 10 の場合はチェックディジットを 0 とする。
※((1)の答の下1桁の数字)とは((1)の答を10で割った剰余)と同値。
*/
// $twelve : チェックディジットを除いた12桁の数字
// $twelve = trim(str_replace('-', '', $twelve)); // この行は必要に応じて活殺
// 文字数が12桁であり、かつ左から3桁が 978 または 979
if (strlen($twelve) === 12 && (substr($twelve, 0, 3) == '978' || substr($twelve, 0, 3) == '979')) {
$odd_sum = $even_sum = 0;
$odd_sum = 9 + (int)$twelve[2] + (int)$twelve[4] + (int)$twelve[6] + (int)$twelve[8] + (int)$twelve[10];
$even_sum = 7 + (int)$twelve[3] + (int)$twelve[5] + (int)$twelve[7] + (int)$twelve[9] + (int)$twelve[11];
// ↑添字はオフセット 0 から始まるので、桁数-1 (奇数と偶数が逆転)となる
$sum = $odd_sum + $even_sum * 3;
$ChkDgt = 10 - ($sum % 10);
if ($ChkDgt === 10) $ChkDgt = '0';
return $ChkDgt;
} else {
return FALSE;
}
}
// ISBN13 ⇒ ISBN10 に変換
function Isbn13210($ISBN13) {
/* ※ 接頭記号が 979 の場合も、978 と同様の変換でOKなのかは未確認。
というか、978 で不足した場合に 979 を用いるということらしいので、
接頭記号取ったら重複する(区別できない)場合も出てくるということか?
つまり、いずれ変換不可になるってことだろう。
*/
$ISBN13 = trim(str_replace('-', '', $ISBN13)); // この操作で、もともとハイフンがない場合もデータ型は文字列になる?
if (strlen($ISBN13) === 13) {
$nine = substr($ISBN13, 3, 9);
$ISBN10 = $nine . ChkDgt10($nine);
return $ISBN10;
} else {
return FALSE;
}
}
// ISBN10 ⇒ ISBN13 に変換
function Isbn10213($ISBN10) {
/* ※ 強制的に接頭記号を 978 としている。たぶん、979 の ISBN10 は(上記のコメントにより)存在しない筈?
*/
$ISBN10 = trim(str_replace('-', '', $ISBN10)); // この操作で、もともとハイフンがない場合もデータ型は文字列になる?
if (strlen($ISBN10) === 10) {
$twelve = '978' . substr($ISBN10, 0, 9);
$ISBN13 = $twelve . ChkDgt13($twelve);
return $ISBN13;
} else {
return FALSE;
}
}
/*******************************************************/
$Chk = '';
$Str = '';
// 入力値を元に変換
if (isset($_GET['Chk']) && $_GET['Chk']) {
$Chk = trim(str_replace('-', '', $_GET['Chk']));
if (strlen($Chk) === 10) {
$Str .= 'ISBN10 : ' . $Chk . '<br />';
$Str .= 'ISBN13 : ' . Isbn10213($Chk) . '<br />';
}
elseif (strlen($Chk) === 13) {
$Str .= 'ISBN10 : ' . Isbn13210($Chk) . '<br />';
$Str .= 'ISBN13 : ' . $Chk . '<br />';
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>ISBN 10 ⇔ 13 変換</title>
</head>
<body>
<h1>ISBN 10 ⇔ 13 変換</h1>
<form action="" method="GET">
<input type="text" id="Chk" name="Chk" value="<?php echo $Chk; ?>" />
<input type="submit" value="変換" />
</form>
<p><?php echo $Str; ?></p>
</body>
</html>
Tail-Lagoon @ 13:07
|
PageUp
2008/07/08(火)
以下は、恥ずかしながら、つい最近知りました。
文字列の変数は、実は各文字を一文字ずつ配列として取り出すことができる。呼び出す時は、左(文字列の頭)からのバイト数を添え字にする。
例 :
$str = ‘012345678′;
echo ‘$str[0] = ‘ . $str[0] . ‘<br />’;
echo ‘$str[1] = ‘ . $str[1] . ‘<br />’;
echo ‘$str[2] = ‘ . $str[2] . ‘<br />’;
echo ‘$str[9] = ‘ . $str[9] . ‘<br />’;
結果 :
$str[0] = 0
$str[1] = 1
$str[2] = 2
$str[9] =
(注 : バイト単位で分解されるので、マルチバイトでは使用できない)
Tail-Lagoon @ 20:17
|
PageUp
2008/06/30(月)
[Q] : 配列を、マージではなく、単純に加算したらどうなる?
[A] : 右(下記例の $e)の配列要素のうち、左(下記例の $a)の配列に存在しないキーの要素を追加する。 重複するキーは左の配列の元のまま(上書きされない)。
$a = array('a','b','c','d');
$e = array('e','f','g','h','i');
$Res = $a + $e;
var_dump($Res);
------------------------- 結果 -------------------------
array(4) {
[0]=> string(1) "a"
[1]=> string(1) "b"
[2]=> string(1) "c"
[3]=> string(1) "d"
[4]=> string(1) "i"
}
実は最初、要素数が同数の配列でテストしていた(上記例の $e[4] がなかった)ので、加算は不可でエラーも出ないものなのだと誤認してしまった! それはまったくの間違いで、キー名を変えるなり、上記のように要素数を変えるなりしてみればわかるとおり、重複しないキーの要素が、ちゃんと追加される。
テストする仕方がまずいと、このような思い込みをしてしまうことがあるのだと反省(いや、それ以前に、マニュアルもきちんと確認しておけよ、ってことでもある)。
参考 : PHP マニュアル ⇒ 配列演算子
Tail-Lagoon @ 08:01
|
PageUp
関数の中にある変数をグローバル宣言で読込んで参照するということはよくやるのだが、変数である以上、書き換えることももちろん可能だ。(これを知った時、思い掛けない結果だったので、ちょっとショックだったのだが、これって当たり前のことなのか)
ということは、ある関数を走らせて、グローバル変数を書き換えた場合は、リターンの必要もなく変数の内容が変わってしまうということだ。
使いようによっては便利だが、関数の内容を忘れてしまうと、いつのまにか意図せずに変数の値が変わってしまっている、ということも起こる。
何か関数にその機能についての明示的な名前をつけておくか、呼び出した箇所でコメントを残しておいた方が無難だろう。
あるいは、関数の中でのグローバル変数の使用は、参照のみにとどめておくか。
実際、殆どの場合はそういう使用方法なのだが、ルールとして厳格に決めてない限り、関数内でのグローバル変数書き換えはありうることだ。
でもやはり、書き換えない、と決めた方がいいのかもしれない。
Tail-Lagoon @ 08:00
|
PageUp
2008/06/11(水)
これからちょっとフレームワークを使ってみようかな、と思って……。
いろいろ調べたところ、CakePHPが最もとっつきやすそうなので、これを使うことに決めた。
カテゴリー: FrameWork | タグ: CakePHP, PHP
Tail-Lagoon @ 11:46
|
PageUp
2008/04/10(木)
日本語を含む文字列で、全角英数字やアルファベット大文字を半角小文字に変換および半角カナを全角カナに変換する関数。検索キーワードを統一したい場合などに有効。(検索文字列および対象文字列の双方を変換してマッチさせる。ただし、表示する文字は変換前のものをそのまま使用したい場合は、データを二重化し、変換前と後をそれぞれ用意する必要あり)
<?php
function ABC2abc($Word) { // 文字列のうち英数文字を半角・小文字に統一
$Word = mb_strtolower($Word, 'UTF-8');
$Word = mb_convert_kana($Word, 'KVa', 'UTF-8');
// option K:半カナ→全カナ V:濁点文字を一文字 a:全英数→半英数
$Word = mb_strtolower($Word);
return $Word;
}
?>
例 : Japan2008, JAPAN2008 などの文字列を一律 japan2008 に変換
mb_convert_kana について、上記のように文字コードを指定するか、あるいはPHPスクリプトの内部エンコーディングを最初から指定しておく(下記例)かしないと、うまく機能しない場合がある。
<?php
mb_internal_encoding("UTF-8");
?>
カテゴリー: Sample, Web Design | タグ: PHP
Tail-Lagoon @ 15:31
|
PageUp
2008/03/12(水)
.htaccess ファイルを用いて、Webサーバ(Apach)における PHP その他の動作設定を変更することはよくあるが、大概サイト構築時の初期の段階において行い、あとは殆ど顧みることがないため、そのうちすっかり忘れてしまうものだ。そして毎回新しいサイトを作るたび、何だったっけ? と探し回るはめになるので、下記に記録。
DirectoryIndex sample.php index.php index.html
(先に記述したものほど表示の優先順位が上になる)
AddType application/x-httpd-php .html .htm
php_flag register_globals Off
php_flag track_vars On
php_flag display_errors Off
※ PHP の httpd オプションについては下記サイトに詳しい。
http://jamesthornton.com/php/japanese/configuration.directives.html
***
↓以下は、PHP じゃないけど、htaccess 関連としてついでに書いておくと
Options +Includes
AddType text/x-server-parsed-html .shtml .html .htm
(Options は SSI 実行可能領域を設定するのだが、もともと実行可なら必要なし)
※ httpd の設定に関する参考サイト
http://www.tagindex.com/other/htaccess.html
カテゴリー: Sample, Web Design | タグ: htaccess, PHP
Tail-Lagoon @ 16:03
|
PageUp
2008/02/19(火)
<?php
/*** Current URL ***/
$Path = pathinfo($_SERVER["PHP_SELF"]);
$DirName = $Path["dirname"];
$DirNameSlash = $DirName . '/';
$FileName = $Path["basename"];
?>
わりとよく使うくせに、覚えていられない。いつも使う時になって、以前のファイルを探し回るはめになるので、ここに書いておく。
カテゴリー: Sample, Web Design | タグ: PHP
Tail-Lagoon @ 16:17
|
PageUp
2008/02/17(日)
ある複数のブログの更新状態をブログとは別の HTML ページでまとめて表示したい(例えば、ある企業のブログの更新状況を、その企業のサイトのトップページに自動で表示したいといった場合)。欲しいのは、エントリーのタイトルと日付とサマリー。
というようなとき、最も手っ取り早いのは、ブログが吐き出す RSS を利用することだろう。でも XML を扱うのってちょっと面倒くさい。パースだのハンドラーだの、なんじゃそれは? いやちょっと待ってくれ、欲しい情報はほんのわずかなんだ。最新のエントリーひとつ分の上記の内容だけ。
だったら、単純に文字列として取り込んで、必要なものだけ抜き出した方が早くないか? 使用する RSS のタイプも最初から決めてしまえば、RSS のバージョンに振り回される必要もない。別に汎用のリーダを作ろうってわけじゃないんだから。
というわけで、文字コード UTF-8、データ形式は Atom、日付は降順になっていることを前提に、やってみた。以下がそのコード。
カテゴリー: CMS, Sample | タグ: PHP, RSS, TypePad
Tail-Lagoon @ 19:51
|
PageUp