忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP 標準関数その1・文字列の分割・結合を行う関数(explode, implode)について


今回から PHP の標準関数の中で私が良く使うものを選んで、説明していきたいと思います。

その最初として文字列の分解・結合を行う関数である explode 及び implode を取り上げます。




■explode関数

先ずは explode 関数ですが以下の様な定義になっています。(PHP の正式な説明サイトより)

explode ( string $separator , string $string [, int $limit = PHP_INT_MAX ] ) : array
[説明]
  文字列の配列を返します。この配列の各要素は、 string を文字列 separator で区切った部分文字列となります。
[パラメータ ]
  $separator  :区切り文字列。

  $string     :入力文字列。

  $limit      :limit に正の値が指定された場合、返される配列には 最大 limit の要素が含まれ、
                その最後の要素には string の残りの部分が全て含まれます。
                limit パラメータが負の場合、 最後の -limit 個の要素を除く全ての構成要素が返されます。
                limit パラメータがゼロの場合は、1 を指定したものとみなされます。


それでは、簡単な文字列の分割について、以下にスクリプトを示します。 (尚、3行目の設定はWindowsコマンドプロンプトでの実行時に、コンソールへの出力を Shift-JIS にする為のものです)

<?php /* f1-explode.php */
//  Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  分割する文字列
$str = "東京,名古屋,京都,大阪";
//  分割処理
$arr = explode(",", $str);
//  配列の内容表示
print_r($arr);
</html>

これをWindowsコマンドプロンプトで実行すると以下の表示になります。

C:\xampp\htdocs\_test>php f1-explode.php
Array
(
    [0] => 東京
    [1] => 名古屋
    [2] => 京都
    [3] => 大阪
)
 

変数「$arr」に指標「0」から順にカンマで分割された文字列が設定されています。

それでは分割対象の文字列にカンマ(,)が無い場合と、関数の第3引数の「$limit」に指定を行う場合について例を示します。

<?php /* f1-explode-2.php */
//  Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  分割する文字列(カンマが無い)
$str = "東京名古屋京都大阪";
//  分割処理
$arr = explode(",", $str);
//  配列の内容表示
print_r($arr);

//  分割する文字列
$str = "東京,名古屋,京都,大阪";
//  分割処理
$arr = explode(",", $str, 2);   //  limit:2 を設定
//  配列の内容表示
print_r($arr);
</html>

これをWindowsコマンドプロンプトで実行すると以下の表示になります。

C:\xampp\htdocs\_test>php f1-explode-2.php
Array
(
    [0] => 東京名古屋京都大阪
)
Array
(
    [0] => 東京
    [1] => 名古屋,京都,大阪
) 

分割文字列の中にカンマが無い場合は配列の指標「0」に分割指定文字列そのものが設定されます。
(区切り文字列に分割文字列に存在しないものを指定した場合や、NULL文字列でも同様となります。)
また、「$limit」が分割文字列のカンマの数より小さい場合は配列の指標「$limit - 1」の要素に残りの文字列が設定されます。

■implode関数

implode 関数ですが以下の様な定義になっています。

implode ( string $glue , array $pieces ) : string

[説明]
  配列の要素を glue 文字列で連結した文字列を返します。
[パラメータ ]
  $glue     :連結する文字列。
  $pieces   :連結したい文字列の配列。

以下にimplode 関数を使用した例のスクリプトを示します。

<?php /* f1-implode.php */
//  Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });
//  連結する配列
$arr = array("東京", "名古屋", "京都", "大阪");
//  連結処理(カンマで連結)
$str = implode(",", $arr);
//  文字列の内容表示
echo "カンマで連結    [" . print_r($str, true) . "]\n";

//  連結処理(長い文字列で連結)
$str = implode("--", $arr);
//  文字列の内容表示
echo "長い文字列で連結[" . print_r($str, true) . "]\n";

//  連結処理(空白文字列で連結)
$str = implode("", $arr);
//  文字列の内容表示
echo "空白文字列で連結[" . print_r($str, true) . "]\n";

//  空の配列
$arr = array();
//  連結処理(カンマで連結)
$str = implode(",", $arr);
//  文字列の内容表示
echo "空の配列を連結  [" . print_r($str, true) . "]\n";
?>

これをWindowsコマンドプロンプトで実行すると以下の表示になります。

C:\xampp\htdocs\_test>php f1-implode.php
カンマで連結    [東京,名古屋,京都,大阪]
長い文字列で連結[東京--名古屋--京都--大阪]
空白文字列で連結[東京名古屋京都大阪]
空の配列を連結  []
 

ここまでは、単に関数のテストを行った感じですので、これらを利用した関数のスクリプトで示します。


■explode, implode関数を使った関数の例


大した関数ではないのですが、日付チェック用の関数を作ってみました。
日付が正しければ、日付文字列を返し、エラーの場合は false を返す様になっています。

<?php /* f1-sample.php */
//  Windowsコマンドプロンプトで[XAMPP]のPHPで表示を Shift-JIS にする為の設定
ob_start(function($buf){ return mb_convert_encoding($buf, 'SJIS', 'UTF-8'); });

// =====
//  日付チェック
// =====
//  $date string   :日付を表す文字列
//  [返り値]       :日付OKの場合は日付文字列で返し、NGの場合は false を返す
// =====
function ChkDate($_date) {
    //  ハイフン("-")をスラッシュ("/")に変換
    $date = str_replace("-", "/", $_date);
    //  年月日を分割
    $arr = explode("/", $date);
    //  Y/m/d 形式??
    if (isset($arr[0]) == true && isset($arr[1]) == true && isset($arr[2]) == true) {
        //  intに変換して "Y-n-j" 形式にする
        $intYY = intval($arr[0]);
        $intMM = intval($arr[1]);
        $intDD = intval($arr[2]);
        //  日付チェック
        if (checkdate($intMM, $intDD, $intYY) == true) {
            //  日付OKの場合[Y/n/j]書式で返す
            return implode("/", $arr);

            //以下の処理の方がいいかもしれません
            //$strDate = "{$intYY}-{$intMM}-{$intDD}";
            //return date("Y/n/j", strtotime($strDate));
        }
    }
    //  エラーの場合は[false]を返す
    return false;
}

//  [ChkDate]を使う関数
function ExcChkDate($strDate) {
    $ret = ChkDate($strDate);
    if ($ret === false) {
        echo $strDate."...error\n";
    } else {
        echo $strDate." => ".$ret."...OK\n";
    }
}

//  OKの日付
ExcChkDate("2020/12/01");
//  NGの日付
ExcChkDate("2019/02/29");
//  書式NGの日付
ExcChkDate("201902/29");
//  書式NGの日付
ExcChkDate("/02/29");
?>

これをWindowsコマンドプロンプトで実行すると以下の表示になります。

C:\xampp\htdocs\_test>php f1-sample.php
2020/12/01 => 2020/12/01...OK
2019/02/29...error
201902/29...error
/02/29...error
 














PR

コメント

コメントを書く