|
|
 |
| >IT技術情報>php>PHP第3回:PHP応用
|
 |
 |
 |
 |
【 ページ 】 |
1 | 2
| 3
| 4
| 5
| 6
| 7
| 8 | 9
| 10
|
<<前のページへ
|
 |
8.配列関連の処理
|
配列を扱うための処理をまとめておきます。基本的なところはリファレンスマニュアルなどを参照いただくこととして、便利なのにあまり知られていないだろう部分を中心に書いていきます。
|
 |
| ■foreach 関数 |
 |
配列の各要素に対して処理をする foreach が Perl にもありますが、PHP
にも 存在しています。ただし、PHP4 にしか存在しません。
Perl ほどシンプルな記述はできませんが、便利な場合もあるでしょう。
リファレンスマニュアルにもありますが、通常の配列はもちろん、連想配列にも
使用できます。下記にそのサンプルを示します。
| |
 |
$hoge = array("abc"=>123, "def"=>456, "ghi"=>789);
foreach( $hoge as $key => $value ) {
print "$key => $value\n";
}
|
 |
php-4.0.3pl1 にて試してみましたが、2 次元以上の配列については 現状使えないようです。
|
 |
| ■array_walk 関数 |
 |
Perl の map 関数に相当する関数です。配列の各要素に対して、 関数で定義した操作をします。まずシンプルな
1次連想配列 の内容をすべて表示するサンプルを示します。
array_walk の第 1 引数が対象とする配列、第 2 引数が操作用関数名に
なっています。
dispArray 関数には二つの引数がありますが、これは array_walk
関数が無条件に渡す引数です。1 つ目が 配列の値、2 つ目がキーとなります。
| |
 |
$hoge = array("abc" => "123", "def" => "456", "ghi" => "789");
function
dispArray($val, $key) {
print "$key => $val\n";
}
array_walk( $hoge, "dispArray" );
|
 |
結果は
| |
 |
abc => 123
def => 456
ghi => 789
|
 |
となります。
2 次元の連想配列に対する操作も行えます。
| |
 |
$hoge = array( "one" => array("1-abc" => "123", "1-def" => "456", "1-ghi" => "789"),
"two" => array("2-abc" => "123", "2-def" => "456", "2-ghi" => "789"),
"three" => array("3-abc" => "123", "3-def" => "456", "3-ghi" => "789")
);
function
dispArray($val, $key, $upperkey = "" ) {
// キーが 0 だった場合にも注意。
if( $upperkey == "" ) {
$upperkey = "";
} else {
$upperkey = "$upperkey\t:: ";
}
print "$upperkey $key => $val\n";
}
function
disp2DArray($val, $key) {
array_walk($val, "dispArray", $key);
}
array_walk( $hoge, "disp2DArray" );
|
 |
disp2DArray 中の array_walk の第 3 引数では、連
想配列の上位のキーを渡しています。これは、 dispArray に第 3 引数として渡されます。このよう
に操作する用の配列に引数を渡すことも可能です。
実行結果は、
| |
 |
one :: 1-abc => 123
one :: 1-def => 456
one :: 1-ghi => 789
two :: 2-abc => 123
two :: 2-def => 456
two :: 2-ghi => 789
three :: 3-abc => 123
three :: 3-def => 456
three :: 3-ghi => 789
|
 |
となります。
また、もとの配列に対して操作をしたい場合は、操作 用関数の第一引数をリファレンスの形で受け取る必要
があります。
下記に連想配列中の全ての値を 2 倍するサンプルを示します。
| |
 |
$hoge = array("abc" => "123", "def" => "456", "ghi" => "789");
// 修正用関数
function
modifyArray(&$val, $key) {
$val *= 2;
}
// 表示用関数
function
dispArray($val, $key) {
print "$key => $val\n";
}
array_walk( $hoge, "modifyArray" );
reset($hoge);
array_walk( $hoge, "dispArray" );
|
 |
modifyArray 関数の第一引数の受け取り方に注意してください。
リファレンスで受け取る場合には 「&$変数名」と書きます。
なお、上記サンプルのように、PHP のバージョンによっては reset が必要な 場合があるようです。
|
 |
| ■array_rand 関数(ランダムパスワード生成) |
 |
array_rand という関数をつかうと、ランダムな配列 のキーをいくつかとりだすことができます。第
2 引数で取り出す個数を指定するのですが、一つの場合は 普通のスカラ変数に、複数取り出す場合は配列に関数
の返り値(キー)が返ります。 この関数は PHP3 では使用できません。
ただし、第 2 引数に配列の大きさと同じ値を指定す ると、全くランダムでない、もとのままの並びが帰っ
てくることに注意してください。
これを応用して、ランダムパスワードを生成するための サンプルを作りました。$pwelemstr
で構成文字を指定、 PASSWORD_LEN でパスワードの長さを指定します。
| |
 |
//------------------------------------------//
// ランダムなパスワードを生成するプログラム //
//------------------------------------------//
// パスワードの長さ設定
define(PASSWORD_LEN, 16);
// 乱数表のシードを決定
srand((double)microtime() * 54234853);
// パスワード文字列の配列を作成
$pwelemstr = "abcdefghkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ2345679!#%;<>";
$pwelem = preg_split("//", $pwelemstr, 0, PREG_SPLIT_NO_EMPTY);
// ランダムパスワードを生成し、表示。
print makePassword(PASSWORD_LEN) . "\n";
// ランダムパスワードを生成する関数
function
makePassword($length) {
global $pwelem;
$password = "";
for($i=0; $i<$length; $i++ ) {
// パスワード文字列を生成
$password .= $pwelem[array_rand($pwelem, 1)];
}
return $password;
}
|
 |
$pwelemstr から preg_split 関数を使って、$pwelem[0]="a",
$pwelem[1]="b", ... という配列を生成しています。
その後、array_rand 関数を使って、その配列からラ ンダムに一文字ずつ取り出してパスワードを生成しています。
array_rand において、ランダムな値の生成は、mt_rand 系ではなく、単なる
rand 系が使われているようです。ですから、srand を用いて乱数テーブルの シードを与えます。
下記の様にクラス化してもよいかもしれません。
| |
 |
//--------------------------------------//
// ランダムなパスワードを生成するクラス //
//--------------------------------------//
// ランダムパスワードを生成し、表示。
$passwordGenerator = new randomPassword(16);
print $passwordGenerator->makePassword() . "\n";
class randomPassword {
var $cElemStr = "abcdefghkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ2345679!#%;?+<@>";
var $cElem;
var $cLength = 16;
function randomPassword ($len = 16, $seed = 54234853) {
srand((double)microtime() * $seed);
$this->cLength = $len;
$this->cElem = preg_split("//", $this->cElemStr, 0, PREG_SPLIT_NO_EMPTY);
}
// ランダムパスワードを生成する関数
function makePassword() {
$password = "";
for($i=0; $i<$this->cLength; $i++ ) {
// パスワード文字列を生成
$password .= $this->cElem[array_rand($this->cElem, 1)];
}
return $password;
}
}
|
 |
なお、これらのサンプルで作成したパスワードがクラック されたからといっても、責任は持てません ^^;
|
|
 |
【 目次
】
1.リロード対策クラス
2.PostgreSQL
3.MySQL
4.メール
5.メール用クラス
6.セッション管理(PHP4)
7.日付処理
Tips
8.配列処理
Tips
9.オブジェクト指向
10.PDF
関数の使用
|
 |
【 関連記事 】
|
|
 |
 |
|
サイト内全文検索 |
| スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。 |
|