株式会社ラクス  ITエンジニア総合支援サイト スタックアスタリスク フルマネージド専用サーバー エクスユニット
ITエンジニアとして 知る 学ぶ
 
Java
.NET
PHP
プログラミング一般
DataBase
システム/サーバ構築
システム/サーバ運用
技術系一般知識
 
 
>IT技術情報>php>PHP第3回: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 関数を使って、その配列からラ ンダムに一文字ずつ取り出してパスワードを生成しています。


▼Java や Linux を体系的に学びましょう!▼
Stack*のラクスが、
新学習方式のカリキュラムを開発しました!
14700円から(*1)、Java や Linux を体系的に学べます!!
(*1 テキスト代のみの税込料金です)




  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 関数の使用


【 関連記事 】
PHP
第1回:PHP基礎
第2回:PHP中級
第3回:PHP応用

サイト内全文検索
スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。


簡単レンタルメールフォーム
300メガ1000円〜 XBitのレンタルサーバー
500メガ1995円〜 電話サポート/PostgreSQL/専用SSLなどにも対応!お客様のニーズを網羅したレンタルサーバ
ホームページ制作のアシストウェブ
STACK* 執筆の講師陣から習得する!! ITエンジニアスクール アイティブースト
統合メールサポートシステム 〜MailDealer(メールディーラー)〜
システム開発,IT教育 〜株式会社アイティーブースト(ITBoost)〜
簡単 営業支援/顧客管理ツール Easy Sales
  利用規約 お問い合わせ・ご意見 スタックアスタリスクについて 運営会社について 
  レンタルサーバー ホスティング 専用サーバー メールフォーム ショッピングカート メール共有 ITエンジニア派遣 Linux講座 Java講座 メール配信 レンタルサーバー Webデータベース 検索サービス
CopyrightcRAKUS Co.,Ltd. All Rights Reserved.  メール管理・共有 顧客管理(CRM)もできるメール対応サポートシステム JAVA LINUX CISCO 技術者派遣 育成事業 株式会社ラクス