[PHP]ランダムな文字列の生成

任意の文字列を組み合わせてランダムな文字列を生成する場合、
方法は幾つもありますがシンプルなのはこのようなものだと思います。

<?php
//生成する文字数
$length = 10;

//使用する文字
$char = '1234567890abcdefghijklmnopqrstuvwxyz';

$charlen = mb_strlen($char);
$result = "";

for($i=1;$i<=$length;$i++){
  $index = mt_rand(0, $charlen - 1);
  $result .= mb_substr($char, $index, 1);
}

echo $result;

数字とアルファベットの小文字の中から10文字選んでいます。
もし大文字のアルファベットも使用したい場合は $char に書き足します。

より複雑なランダム文字列の生成については次回に続きます。

[PHP]文章中の単語に自動でリンクを貼る(キーワードリンク)

よくコンピュータ系のサイトで専門用語に解説ページへのリンクが貼られているのを見かけますが、構造的には単語と URL を用意しておき、当てはまる単語にリンクを貼るというものです。

単純に組むとすでに置換した単語を二重に置換してしまうので、少し工夫が必要になります。

<?php
//元となる文章
$str = "ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです";
 
//単語とURLのリスト
$wordlist = array(
  "ウェブ" => "http://en.wikipedia.org/wiki/Web",
  "ウェブブラウザ" => "http://en.wikipedia.org/wiki/Web_browser",
  "ウェブサイト" => "http://en.wikipedia.org/wiki/Website",
  "ソフトウェア" => "http://en.wikipedia.org/wiki/Software"
);
 
//単語の文字数が長いものから順に並べ替える
uksort($wordlist, function($a, $b){
	return mb_strlen($b, 'utf-8') - mb_strlen($a, 'utf-8'); });

$pairs = array();

foreach($wordlist as $word => $url){
	$pairs[$word] = '<a href="' . $url . '">' . $word . '</a>';
}

$str = strtr($str, $pairs);
echo $str;

今回は「ウェブブラウザとはウェブサイトを閲覧するためのソフトウェアです」という文の用語にリンクをつけています。
単語は配列に $wordlist 登録し、キーが対象語句、値がリンク先です。

途中文字の長い順に単語を並び替えていますが、そうしておかないと「ウェブブラウザ」を置換するより先に「ウェブ」だけが置換され、「ブラウザ」の文字が取り残されてしまうからです。


(2014/05/07 加筆)

コメントで教えていただきましたが strtr は基本的にマルチバイト非対応の関数のため、文字コードによっては誤作動を起こす場合があるようです。
その場合は以下のマルチバイト対応版 mb_strtr() を使うことをおすすめします。

参考: 「マルチバイト未対応の関数をいろいろ対応させてみた」
http://qiita.com/mpyw/items/ceae0ed5285093c76087#2-7

[PHP]クラスの基礎 メンバ変数とメンバ関数

大規模なPHPプログラムでは必須になってくる Class なのですが、
今ひとつピンとこないので基礎からおさらいしてみようと思います。

クラスはプロパティ(メンバ変数)とメソッド(メンバ関数)を持ち、
複数の関数をひとつのグループにまとめることができます。

メンバ変数はクラス内のメンバ関数で共有して利用できる変数で、
アクセス権によって3種類に分類されます。

「public」はクラスの中でも外でも利用できます。
具体的には下記のように使います。

<?php
class Test{
    public $foo = 123;
}

$test = new Test();
echo $test->foo;

「private」はそのクラス内でしか利用できません。
上のソースの public を private に変えてみるとエラーが出るのがわかります。
private は次のように用います。

<?php
class Test{
    private $foo = 123;

    function abc(){
        echo $this->foo;
    }
}

$test = new Test();
$test->abc();

「$this」って何?と思われるかもしれませんが、これはオブジェクト自身を指す変数です。
「echo $foo;」のようにはできないので気をつけて下さい。

3つ目は「protected」です。
こちらもクラス内でしか使えませんが、継承した子クラスからはアクセスできる権限です。

<?php
class Test{
  protected $foo = 123;
}

class Example extends Test {
  function abc(){
    echo $this->foo;
  }
}

$example = new Example();
$example->abc();

子クラスは「class 子クラス名 extends 親クラス {}」の形で定義します
子クラスは親クラスのすべてのメソッドを受け継ぐ(継承)ので、子クラスの中でも
親クラスで定義したメソッドを利用できます。

「protected」は子クラスからでもアクセスできるのに対して、
「private」はそのクラス内でしか利用できないので、上のソースを「private」に
書き換えるとエラーが発生します。