PHP 文字列の一部を取得するsubstr,mb_substrの使い方

文字列の一部を取得する方法です。

substr」「mb_substr」を使用することで、文字の一部を取得することが出来ます。
substr」も「mb_substr」も記述方法は同じです。

substr(値, 何文字目から取り出すか, 何文字取り出すか);
mb_substr(値, 何文字目から取り出すか, 何文字取り出すか);

日本語(マルチバイト文字)には「mb_substr」を使用しましょう。

第一、第二引数のみの場合

第一、第二引数のみの場合は、指定した文字以降を全て取り出します。0から数える点に注意して下さい。ちなみに第二引数は必須なので、指定しないとエラーになります。(指定しないとsubstr使う意味が無いですけど)

下記は変数xの0から数えて2文字目の c 以降を取得して表示する例です。取り出した後の変数xに変化はありません。

<?php
    $x = "abcdefg";
    echo substr($x, 2)."<br>"; // 0から数えるので 0,1,2 → a,b,c c以降の全てを表示 

    echo $x; // $xに変化はありません。
?>

» 実行結果
 

第三引数を指定する場合

第三引数で、何文字取り出すかを指定することが出来ます。

下記は変数xの0から数えて3文字目 d から2文字を取得して表示する例です。

<?php
    $x = "abcdefg";
    echo substr($x, 3, 2); // d から2文字 de を表示
?>

» 実行結果
 

後ろから取り出す場合

第二引数にマイナスの数値を指定することで、「後ろから何文字目」を指定できます。マイナスの場合は0からではなく、-1から数える事に注意して下さい。

<?php
    $x = "abcdefg";
    echo substr($x, -3, 2); // -1から数えるので -1,-2,-3 → g,f,e eから2文字 ef を取得して表示
?>

» 実行結果
 

PHP 文字列の文字数をカウントするstrlen,mb_strlenの使い方

文字列の文字数をカウントする方法です。

strlen」「mb_strlen」を使用することで、()内の値が何バイトなのか、何文字なのか調べることが出来ます。「strlen」も「mb_strlen」も記述方法は同じです。

strlen(値);
mb_strlen(値);

strlen

「strlen」はバイト数を返してくれます。半角は1バイト、全角は文字コードや文字によって異なるようです。
下記例は「UTF-8」で、ひらがなの場合ほぼ?全部?1文字3バイトのようです。

<?php
    $x = "abcdefg";
    echo "変数xは".strlen($x)."バイトです。<br>";

    $y = "あいうえおかきくけこさしすせそ";
    echo "変数yは".strlen($y)."バイトです。<br>";
?>

» 実行結果
 

mb_strlen

「mb_strlen」は半角でも全角でも「1文字に対して1」の文字数を返してくれます。

<?php
    $x = "abcdefg";
    echo "変数xは".mb_strlen($x)."文字です。<br>";

    $y = "あいうえおかきくけこさしすせそ";
    echo "変数yは".mb_strlen($y)."文字です。<br>";
?>

» 実行結果
 

最後に・・・

「mb_strlen」で正しい文字数が表示されない場合、php.iniの設定を変更する必要があります。

php.iniの設定を確認するには下記を実行します。

<?php
    phpinfo();
?>

このブログ(ロリポップ)の場合、管理画面からphp.iniの設定で、「mbstring.language」を「Japanese」に、「mbstring.internal_encoding」を「UTF-8」にすることで正常に動作させる事ができました。
大体のレンタルサーバーは管理画面から設定が出来ると思います。

xamppの場合、phpinfo()実行時の「Loaded Configuration File」に表示されてあるディレクトリにphp.iniファイルがあると思いますので、直接修正します。

設定方法は、「XAMPPをインストールしてローカル開発環境を作ろう」のMYSQLとPHPの初期設定をご覧ください。

PHP ランダムな数値を取得する方法(rand,mt_rand)

ランダムな数値を取得する方法です。

rand」または「mt_rand」を使用することでランダムな数値を取得できますが、「mt_rand」の方が処理速度が早いそうなので、基本的には「mt_rand」を使用するといいでしょう。「rand」も「mt_rand」も記述方法は同じです。

範囲を指定する

取得する数値の範囲を指定する場合は下記のように記述します。

mt_rand(最小値,最大値);
 

下記は、1~10のランダムな数値を取得する例です。
再読み込みする度に数値が変わります。

<?php
    echo mt_rand(1,10);
?>

» 実行結果
 

範囲を指定しない

範囲を指定せずに実行することも出来ます。

mt_rand();

この場合、最小値は0となり、最大値は環境によって異なるそうです。私が試した限り最大値は「2147483647」になりましたので、下記を実行すると0~2147483647までのランダムな数値が表示されます。

<?php
    echo mt_rand();
?>

» 実行結果
 

最後に・・・

範囲を指定する場合、あまり大きな数値を指定するとおかしな動きになりますので、注意しましょう。

jQuery 親要素のサイズに合わせて画像をリサイズしてフィットさせるプラグイン

親要素のサイズに合わせて画像をリサイズしてフィットさせるプラグインは既存のものをいくつか試したのですが、不具合が発生したり理想通りにならなかったので自作しました。ということでご紹介です。

サンプル

まずは「サンプル」からご覧ください。
サンプルでは640×340ピクセルの画像と320×640ピクセルの画像を100×100ピクセルの親要素(div)にフィットさせています。

概要を説明すると、
・親要素にcss[overflow: hidden;]を指定
・親要素と画像のサイズを取得して、画像が親要素の中央になるようにcss[position]で左または上にずらす
ということを行っています。

HTML

jQuery本体とプラグインを読み込みます。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="js/img-resize.js"></script>
 

imgに任意のクラス名を付けます。
(サンプル画像は「PLACEHOLD.IT」から表示させていただきました)

<div class="box"><img src="http://placehold.it/640x340/27709b/ffffff" class="resize"></div>
<div class="box"><img src="http://placehold.it/320x640/27709b/ffffff" class="resize"></div>
 

bodyの閉じタグの直前でプラグインを呼び出します。
画像に付けたクラス名を指定して下さい。
$(function(){・・・}); ではなく、
$(window).on(‘load resize’, function() {・・・}); で呼び出して下さい。
画像より先にスクリプトが実行されてしまうとうまくリサイズされないため、loadでページを全て読み込んだ後に実行します。
また、レスポンシブに対応するためにresizeで画面のリサイズが行われる度に実行するようにしています。

<script>
$(window).on('load resize', function() {
  $('.resize').imgResize();
});
</script>

CSS

親要素は縦横のサイズと overflow: hidden; が必須です。
$(window).on(‘load resize’, function() {・・・}); で呼び出しているので、一瞬リサイズ前の画像が表示されてしまうのを防ぐため、画像に付けたクラスには display: none; を指定します。

.box{
  width: 100px;
  height: 100px;
  margin: 20px;
  overflow: hidden;
}

.resize{
  display: none;
}

最後に・・・

ちょっと力技ではありますが、IE・Firefox・Chromeで問題なく動作しているようなので、まぁいいかなと。

サンプルのダウンロードは「こちら」からどうぞ。

PHP 小数の四捨五入(round)・切り上げ(ceil)・切り捨て(floor)

小数の四捨五入(round)・切り上げ(ceil)・切り捨て(floor)の使い方です。

四捨五入(round)

「round」は小数を四捨五入します。

<?php
    echo round(3.4)."<br>\n"; // 4を切り捨てて3
    echo round(3.5)."<br>\n"; // 5を切り上げて4
?>

» 実行結果
 

第2引数で四捨五入を行う桁数を指定できます。
■例
第2引数が0の場合:小数点第0位までを表示します(小数点第1位を四捨五入)
第2引数が1の場合:小数点第1位までを表示します(小数点第2位を四捨五入)
第2引数が2の場合:小数点第2位までを表示します(小数点第3位を四捨五入)

<?php
    echo round(1.2345, 2)."<br>\n"; // 4を切り捨てて1.23
    echo round(1.2345, 3)."<br>\n"; // 5を切り上げて1.235
?>

» 実行結果
 

第三引数でモードを選択できます。マニュアルを読んでもまっったく意味が分かりませんでしたが、色々試した結果下記のようになりました。間違ってたらご指摘下さい。
■モードの種類

PHP_ROUND_HALF_UP
通常の四捨五入です。
PHP_ROUND_HALF_DOWN
五捨六入です。
PHP_ROUND_HALF_EVEN
四捨六入(5は切り捨てて偶数になるなら切り捨て、切り上げて偶数になるなら切り上げ)
PHP_ROUND_HALF_ODD
四捨六入(5は切り捨てて奇数になるなら切り捨て、切り上げて奇数になるなら切り上げ)
<?php
    //PHP_ROUND_HALF_UP
    //四捨五入
    echo round(0.04, 1, PHP_ROUND_HALF_UP)."<br>\n";        // 4を切り捨てて0
    echo round(0.14, 1, PHP_ROUND_HALF_UP)."<br>\n";        // 4を切り捨てて0.1
    echo round(0.05, 1, PHP_ROUND_HALF_UP)."<br>\n";        // 5を切り上げて0.1
    echo round(0.15, 1, PHP_ROUND_HALF_UP)."<br>\n";        // 5を切り上げて0.2
    echo round(0.06, 1, PHP_ROUND_HALF_UP)."<br>\n";        // 6を切り上げて0.1
    echo round(0.16, 1, PHP_ROUND_HALF_UP)."<br>\n<br>\n";  // 6を切り上げて0.2
    
    //PHP_ROUND_HALF_DOWN
    //五捨六入
    echo round(0.04, 1, PHP_ROUND_HALF_DOWN)."<br>\n";        // 4を切り捨てて0
    echo round(0.14, 1, PHP_ROUND_HALF_DOWN)."<br>\n";        // 4を切り捨てて0.1
    echo round(0.05, 1, PHP_ROUND_HALF_DOWN)."<br>\n";        // 5を切り捨てて0
    echo round(0.15, 1, PHP_ROUND_HALF_DOWN)."<br>\n";        // 5を切り捨てて0.1
    echo round(0.06, 1, PHP_ROUND_HALF_DOWN)."<br>\n";        // 6を切り上げて0.1
    echo round(0.16, 1, PHP_ROUND_HALF_DOWN)."<br>\n<br>\n";  // 6を切り上げて0.2
    
    //PHP_ROUND_HALF_EVEN
    //四捨六入 (5は切り捨てて偶数になるなら切り捨て、切り上げて偶数になるなら切り上げ)
    echo round(0.04, 1, PHP_ROUND_HALF_EVEN)."<br>\n";        // 4を切り捨てて0
    echo round(0.14, 1, PHP_ROUND_HALF_EVEN)."<br>\n";        // 4を切り捨てて0.1
    echo round(0.05, 1, PHP_ROUND_HALF_EVEN)."<br>\n";        // 5を切り捨てると偶数の0になるので切り捨て
    echo round(0.15, 1, PHP_ROUND_HALF_EVEN)."<br>\n";        // 5を切り上げると偶数の2になるので切り上げ
    echo round(0.06, 1, PHP_ROUND_HALF_EVEN)."<br>\n";        // 6を切り上げて0.1
    echo round(0.16, 1, PHP_ROUND_HALF_EVEN)."<br>\n<br>\n";  // 6を切り上げて0.2
    
    //PHP_ROUND_HALF_ODD
    //四捨六入 (5は切り捨てて奇数になるなら切り捨て、切り上げて奇数になるなら切り上げ)
    echo round(0.04, 1, PHP_ROUND_HALF_ODD)."<br>\n";        // 4を切り捨てて0
    echo round(0.14, 1, PHP_ROUND_HALF_ODD)."<br>\n";        // 4を切り捨てて0.1
    echo round(0.05, 1, PHP_ROUND_HALF_ODD)."<br>\n";        // 5を切り上げると奇数の1になるので切り上げ
    echo round(0.15, 1, PHP_ROUND_HALF_ODD)."<br>\n";        // 5を切り捨てると奇数の1になるので切り捨て
    echo round(0.06, 1, PHP_ROUND_HALF_ODD)."<br>\n";        // 6を切り上げて0.1
    echo round(0.16, 1, PHP_ROUND_HALF_ODD)."<br>\n<br>\n";  // 6を切り上げて0.2
?>

» 実行結果
 

※モードを指定する時は必ず第2引数が必要です。第2引数を指定せずにモードを指定しても、指定したつもりのモードが数値として第2引数になり、第3引数は指定されず、意図しない結果を表示します。
・第2引数を指定ぜずにPHP_ROUND_HALF_UPを指定した場合
 → 第2引数に1が指定され、第3引数が指定されていない処理になる。
・第2引数を指定ぜずにPHP_ROUND_HALF_DOWNを指定した場合
 → 第2引数に2が指定され、第3引数が指定されていない処理になる。
・第2引数を指定ぜずにPHP_ROUND_HALF_EVENを指定した場合
 → 第2引数に3が指定され、第3引数が指定されていない処理になる。
・第2引数を指定ぜずにPHP_ROUND_HALF_ODDを指定した場合
 → 第2引数に4が指定され、第3引数が指定されていない処理になる。

切り上げ(ceil)

「ceil」は小数を切り上げます。

<?php
    echo ceil(3.1)."<br>\n"; // 1を切り上げて4
    echo ceil(3.9)."<br>\n"; // 9を切り上げて4
?>

» 実行結果
 

桁数を指定して切り上げたい場合は、一度その桁まで整数になる数値を掛けて切り上げを行った後に同じ数値で割るという方法があります。
下記は、1.2345の4を切り上げて1.24にする例です。

<?php
    echo ceil(1.2345 * 100) / 100; // 4を切り上げて1.24
?>

» 実行結果
 

切り上げ(floor)

「floor」は小数を切り捨てます。

<?php
    echo floor(3.1)."<br>\n"; // 1を切り捨てて3
    echo floor(3.9)."<br>\n"; // 9を切り捨てて3
?>

» 実行結果
 

桁数を指定して切り捨てたい場合は、一度その桁まで整数になる数値を掛けて切り捨てを行った後に同じ数値で割るという方法があります。
下記は、1.2345の5を切り捨てて1.234にする例です。

<?php
    echo ceil(1.2345 * 1000) / 1000; // 5を切り捨てて1.234
?>

» 実行結果
 

PHP 関数の作り方

関数の作り方です。

私の個人的な考え方(?)ですが、関数とは「ひとつもしくは複数の処理に名前を付けて、呼び出されたときに処理を実行するもの」です。
関数のいいところは、同じような処理を繰り返し行う場合に、何度も同じことを書かずに済むことだと思います。

関数は下記のように書きます。

function 関数名(){
    処理;
}

helloを表示してみる

とても簡単ですが、下記はHelloを表示するhelloという関数を準備・実行する例です。

<?php
    function hello(){
        echo "Hello";
    }

    hello();
?>

» 実行結果
 

関数を呼び出す時は

    関数名();

とします。
関数は何度でも呼び出すことができます。

<?php
    function hello(){
        echo "Hello";
    }

    hello();
    hello();
    hello();
?>

» 実行結果
 

関数は呼び出しより先に書くことが一般的ですが、後に書いても大丈夫です。

<?php
    hello();
    
    function hello(){
        echo "Hello";
    }
?>

» 実行結果
 

同じ関数名の関数を複数書いてしまうとエラーになります。
関数名は変数と違って大文字と小文字が区別されないので「hello(){・・・」「Hello(){・・・」「HELLO(){・・・」 これらは全て同じ関数として認識されます。

下記はエラーになりますので、気をつけましょう。

<?php
    function hello(){
        echo "hello";
    }

    function Hello(){
        echo "Hello";
    }
?>

引数を使ってみる

引数とは関数に渡す値のことで、呼び出すときに()の中に書きます。
引数は複数渡すことができます。

関数名(引数1,引数2,・・・);

渡ってきた引数は関数の中で使用することができます。

function 関数名(引数1,引数2,・・・){
    処理の中で引数を使用できます。
}

具体的な例として、自分の名前と相手の名前を関数に渡して挨拶文を表示させてみます。

<?php
    function greeting($me, $you){
        echo $you."さん、こんにちは。<br>\n";
        echo "私の名前は".$me."です。<br>\n";
    }

    greeting("田中", "佐藤");
?>

» 実行結果
 

上記で気をつけたいことは、関数内で使用している変数は関数内だけでしか使えないということです。
下記のように関数内で使用した$meを関数の外で使おうとしても表示されません。

<?php
    function greeting($me, $you){
        echo $you."さん、こんにちは。<br>\n";
        echo "私の名前は".$me."です。<br>\n";
    }

    greeting("田中","佐藤");
    
    echo $me;
?>

また、「greeting($me, $you){・・・」と書いているのに、引数を渡さなかった場合はエラーとなりますので気をつけましょう。

引数のデフォルト値

引数にはデフォルト値を設定することができます。
下記は、第2引数が渡されてきたらその値を、渡されなかったら「名無しさん」を使用して挨拶を表示する例です。

<?php
    function greeting($me, $you = "名無しさん"){
        echo $you."さん、こんにちは。<br>\n";
        echo "私の名前は".$me."です。<br>\n";
    }

    greeting("田中");
    greeting("田中", "佐藤");
?>

» 実行結果
 

「$you = “名無しさん”」とすることで、引数が渡されなかった時のデフォルト値を設定することができます。

上記を「function greeting($you = “名無しさん”, $me){・・・」として、「greeting(“田中”);」で田中だけを渡すと、田中は$youに代入され、$meが渡ってきていないことでエラーになります。デフォルト値を設定する場合はデフォルト値を設定しない引数の後に書かなくてはいけないことに注意しましょう。

戻り値について

これまでは、echoを使って表示のみを行ってきましたが、関数内で処理した内容をreturnを使って戻す方法について見てみます。

function 関数名(引数1,引数2,・・・){
    return 処理;
}

変数 = 関数名(引数1,引数2,・・・);

上記のように戻り値を変数に入れて処理をすることが多いと思います。

具体的な例として、引数として三角形の底辺と高さを渡し、計算結果の面積を変数にいれてechoで表示してみます。

<?php
    function menseki($teihen,$takasa){
        return ($teihen * $takasa / 2);
    }
    
    $answer = menseki(10,5);
    
    echo $answer;
?>

» 実行結果
 

PHP ループのスキップ・中断

ループをスキップ・中断させる方法です。

while」「for」「foreach」等のループ処理で、ある条件でループをスキップさせるには「continue」を、ループを中断させるには「break」を使用します。

continue

下記は、for文で1~20をechoで表示する途中で、5だけをスキップさせる例です。

<?php
    for($i = 1; $i <= 20; $i++){
        if($i == 5){
            continue;
        }
        echo $i."<br>\n";
    }
?>

» 実行結果

break

下記は、for文で1~20をechoで表示する途中で、変数iが10になったらループを中断させる例です。

<?php
    for($i = 1; $i <= 20; $i++){
        if($i == 10){
            break;
        }
        echo $i."<br>\n";
    }
?>

» 実行結果

PHP foreachの使い方

「foreach」の使い方です。

foreachは「while」「for」と同じくループ処理を行う構文ですが、配列を扱うことに特化しています。

下記は配列の中身をすべて表示する例です。

<?php
    $fruit = array("apple", "orange", "peach", "melon");

    foreach($fruit as $value){
        echo $value."<br>\n";
    }
?>

» 実行結果

変数fruitを一つ(apple)取り出して変数valueにいれて、{}内の処理を行います。それをorange、peach、melonと変数の中身分繰り返します。

また、連想配列では、

(配列 as キーを入れる変数 => 配列の中身を入れる変数)

とすることで、添字(キー)を一緒に取り出して表示させることが出来ます。

<?php
    $week = array(
        "Sun" => "Sunday",
        "Mon" => "Monday",
        "Tue" => "Tuesday"
    );
    
    foreach($week as $key => $value){
        echo $key."は".$value."の略です。<br>\n";
    }
?>

» 実行結果

もちろん連想配列でもキーを取り出さずに中身だけを取り出して表示することも可能です。

※例で使っている$valueや$keyは他の変数名でも大丈夫です。通例として$valueや$keyがよく使われています。

PHP countの使い方

「count」の使い方です。

countは配列の中身の数を返してくれる関数です。

<?php
    $fruit = array("apple", "orange", "peach", "melon");

    echo count($fruit);
?>

» 実行結果

単純なだけに使いどころがたくさんありますので必ず覚えておきましょう。

PHP forの使い方

「for」の使い方です。

前回の記事の「while」では、「繰り返し条件用の変数iの初期値の設定」「ループの条件」「変数iの加算」を別々に行っていましたが、forはこの3つを()の中にまとめて書くことができます。

<?php
    for($i = 1; $i <= 10; $i++){
        echo $i."<br>\n";
    }
?>

» 実行結果

「繰り返し条件用の変数iの初期値の設定」「ループの条件」「変数iの加算」を()の中でセミコロン「;」で区切って書きます。

「$i = 1」「$i <= 10」の次に{}の中の処理を行った後に「$i++」を行うという点に注意してください。 whileより短い行数で書けるので個人的にforを好んでいます。(whileの方が適している処理もあります) また、配列の数を数える「count」を使うことで、下記のように配列の数分ループ処理を行うことなども可能です。

<?php
    $fruit = array("apple", "orange", "peach", "melon");
    
    $count = count($fruit);
    for($i = 0; $i < $count; $i++){
        echo $fruit[$i]."<br>\n";
    }
?>

» 実行結果

count($fruit)は4を返すので、変数iが4になるまでループを繰り返します。
添字(キー)は0から始まるので、$fruit[0]のapple・・・$fruit[3]のmelonまで表示し、変数iが4の場合処理を行わずにループを終了します。

但し、連想配列はforでは扱えませんので、「foreach」を使用する必要があります。