PHP Logo PHP の関数

更新日:2023年02月22日

作成日:2016年01月02日

日付・時刻を扱う

PHP では日付・時刻の演算や整形を行うための関数が「日付・時刻関数」として多数あります。

タイムスタンプ

日付・時刻関数の多くは、日付・時刻のデータを「タイムスタンプ」値として管理しています。「タイムスタンプ」とは、日付・時刻のデータを1970年1月1日からの経過秒(整数値)で表したものです。整数値で日付・時刻を表現することで、日付の加算や減算、比較などが簡単に行える仕組みになっています。

タイムスタンプを生成する関数には次のようなものがあります。

time() 関数

現在の日時のタイムスタンプ値(1970年1月1日 00:00:00 GMT からの通算秒)を秒単位で返します。パラメータはありません。戻り値は整数(型)になります。

time()

microtime() 関数

現在の日時のタイムスタンプ値(1970年1月1日 00:00:00 GMT からの通算秒)をマイクロ秒単まで返します。戻り値は文字列(型)になりますが、オプションのパラメータ「$get_as_float」に TRUE を指定すると、文字列ではなく float を返すようになります。

microtime ($get_as_float)

mktime() 関数

与えられた日付・時刻情報に基づいて、対応するタイムスタンプ値(整数)を返します。引数が不正な場合、 この関数は FALSE を返します。以下が構文です。

mktime ($hour, $minute, $second, $month, $day, $year, $is_dst )

strtotime() 関数

英文形式の文字列をタイムスタンプ値に変換します。

「YYYY/MM/DD」のようなフォーマットの日付から、タイムスタンプ値に変換します。「now」(現在の日付)、「+ 1 day」(1日後)、「+ 1 week 4 days 5 hours」(1週間4日5時間後)のような文字列からもタイムスタンプに変換することができます。以下が構文です。

strtotime ($time, $now )

$time は日付/時刻を表す文字列です。$now はオプションで、返される値を計算するために使用されるタイムスタンプです。省略された場合は現在時刻が適用されます。

date() 関数

date() 関数は指定されたタイムスタンプを日付文字列に整形(フォーマット)します。
以下が構文です。

date ( $format, $timestamp )
  • $format:フォーマット文字列
  • $timestamp:整形するタイムスタンプ(オプション)。省略すると、現在日時のタイムスタンプ(time())が適用されます。

引数 $format で利用できる主な記述子には以下のようなものがあります(DateTime クラスformat() が受け入れるフォーマット)。

これらを組み合わせてフォーマット文字列を作成できます。

引数 $format で利用できる主な記述子
記述子 概要
Y 年(4桁) 例:2015
y 年(2桁) 例:15
M 月(省略形) Jan - Dec
F 月(長い形式) January - December
m 月 01 - 12
n 月 1 - 12
d 日 01 - 31
j 日 1 - 31
D 曜日(省略形) Mon - Sun
l 曜日(長い形式) Monday - Sunday
w 曜日  0(日曜) - 6(土曜)
h 時(12時間単位) 01 - 12
H 時(24時間単位) 01 - 24
g 時(12時間単位) 1 - 12
G 時(24時間単位) 1 - 24
i 分 00 - 59
s 秒 00 - 59
a 午前/午後 am | pm
A 午前/午後 AM | PM
U Unix Epoch (1970年1月1日0時0分0秒) からの秒数

以下は、現在の日時を「YYYY年MM月DD日(曜日)」の形式で表示します。

<?php
echo date('Y年m月d日(D)');
?> 
2024年11月21日(Thu)

time(), mktime(), strtotime() 関数を利用して、特定の日時を整形して表示することができます。

<?php
//10日後
echo date('Y年m月d日(D)', time() + 3600 * 24 * 10) . "<br>";

//2020/10/26 を指定
echo date('Y年m月d日(D)', mktime(0, 0, 0, 10, 26, 2020)). "<br>";

//3週間後の日付
echo date('Y年m月d日(D)', strtotime(' +3week')). "<br>";
?>
2024年12月01日(Sun)
2020年10月26日(Mon)
2024年12月12日(Thu)

mktime()

以下は、mktime() 関数と date() 関数を使って特定の日時を表示する例です。

<?php
$y = date("Y");  //現在の「年」
$m = date("m");  //現在の「月」
$d = date("d");  //現在の「日」

$after_3days = mktime(0, 0, 0, $m, $d + 3, $y);
echo "3日後: ". date('Y年m月d日', $after_3days) ."<br>";

$before_5y_10m = mktime(0, 0, 0, $m - 10, $d, $y - 5);
echo "5年10ヶ月前: ". date('Y年m月d日', $before_5y_10m) ."<br>";
?>
3日後: 2024年11月24日
5年10ヶ月前: 2019年01月21日

また、mktime() 関数の「日」を「0」に指定することで、前の月の最後の日を取得することができます。

<?php
$last_day_prev_month = mktime(0, 0, 0, $m, 0, $y);
echo "先月の最後の日: ". date('Y年m月d日', $last_day_prev_month) ."<br>";
?>
先月の最後の日: 2024年10月31日

gmdate()

date() 関数と似た関数に、gmdate() 関数があります。構文は date() 関数と同じですが、返される時刻が グリニッジ標準時 (GMT) であるところが異なります。

<?php
echo '現在日時: ' . date('Y年m月d日(D)H:i:s a') . "<br>";
echo 'グリニッジ標準時: ' . gmdate('Y年m月d日(l)H:i:s A'). "<br>";
?>
現在日時: 2024年11月21日(Thu)15:20:44 pm
グリニッジ標準時: 2024年11月21日(Thursday)06:20:44 AM

日付の妥当性の検証

checkdate() 関数は、与えられた日付が実際に存在する日付であるかどうかをチェックします。

bool checkdate ( int $month , int $day , int $year )
  • $month : 1 から 12 の間
  • $day : 指定された month の日数の範囲内になります。year がうるう年の場合は、それも考慮されます。
  • $year : 1 から 32767 の間

指定した日付が有効な場合に TRUE、そうでない場合に FALSE を返します。

以下は、指定された年月のカレンダーをテキストで表示するユーザー定義関数の例です。

<?php
function simple_calendar($year, $month) {
  for($i = 1; $i < 32; $i ++) {
    if(checkdate($month, $i, $year)) {
      echo "$i &nbsp;";
      if($i % 7 == 0) {echo "<br>"; }
    }
  }
}
echo "2016年2月の簡易カレンダー <br>";
simple_calendar(2016, 2);
?>
2016年2月の簡易カレンダー
1  2  3  4  5  6  7  
8  9  10  11  12  13  14  
15  16  17  18  19  20  21  
22  23  24  25  26  27  28  
29  

カレンダーの作成

以下は現在の月のカレンダーを表示する例です。

<?php
$y = date("Y");  //現在の「年」
$m = date("m");  //現在の「月」
//今月最初の曜日を取得
$first_day_week = date("w", mktime(0, 0, 0, $m, 1, $y));
//今月最後の日を取得(翌月の 0 日)
$last_day = date("d", mktime(0, 0, 0, $m + 1, 0, $y));
//今月最後の日の曜日を取得
$last_day_week = date("w", mktime(0, 0, 0, $m, $last_day, $y));
//または、$last_day_week = date("w", mktime(0, 0, 0, $m + 1, 0, $y));

echo $y . "年" . $m . "月<br>";

echo "<table border='1' class='mycal'>\n";
echo "<tr>\n";
echo "<td>&nbsp;Sun&nbsp;</td>\n";
echo "<td>&nbsp;Mon&nbsp;</td>\n";
echo "<td>&nbsp;Tue&nbsp;</td>\n";
echo "<td>&nbsp;Wed&nbsp;</td>\n";
echo "<td>&nbsp;Thu&nbsp;</td>\n";
echo "<td>&nbsp;Fri&nbsp;</td>\n";
echo "<td>&nbsp;Sat&nbsp;</td>\n";
echo "</tr>\n";

for($d = 1; $d <= $last_day; $d ++) {
  //それぞれの日($d)の曜日を取得
  $w = date("w", mktime(0, 0, 0, $m, $d, $y));
  if($w == 0 || $d == 1) {
    echo "<tr>\n";
    //最初の日が日曜日以外の場合
    if($first_day_week != 0 && $d == 1) {
      //空白セルで埋める
      for ($i = $first_day_week; $i > 0; $i --) {
        echo "<td>&nbsp;</td>\n";
      }
      //土曜日の場合、閉じタグ</tr>を挿入(省略可能)
      //if($w == 6) {echo "</tr>\n"; }
    }
  }
  echo "<td>$d</td>\n";
  //土曜日の場合、閉じタグ</tr>を挿入(省略可能)
  //if($w == 6) {echo "</tr>\n"; }
}
//最終日が土曜日以外の場合、空白セルで埋める
if($last_day_week != 6) {
  for($i = 6; $i > $last_day_week; $i --) {
    echo "<td>&nbsp;</td>";
  }
}
echo "</table>\n";
?>    
  • 28行目:日曜日($w == 0)か最初の日($d == 1)の場合、"<tr>"を出力
  • 31行目~38行目:最初の日($d == 1)が日曜日以外($first_day_week != 0)の場合、空白のセルで埋める
  • 40行目~42行目:日を出力("<td>$d</td>\n")(閉じタグ</tr>は省略可能)。
2024年11月
 Sun   Mon   Tue   Wed   Thu   Fri   Sat 
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

DateTime クラス

DateTime クラスは PHP に用意されている日付や時間を扱うクラスで、PHP5.2.0 以降で使用できます。

基本的な使い方は DateTime のコンストラクタでインスタンスを生成して、用意されているメソッドを使って何らかの処理をします。

以下は DateTIme() の引数を省略して、現在の日時のインスタンスを生成し、format メソッドで書式を指定してフォーマットした日付を出力する例です。

//現在の日時のインスタンスを生成
$dateTimeNow = new DateTime();

//書式を指定してフォーマットした日付を出力
echo $dateTimeNow->format('Y-m-d H:i:s'); //出力例: 2016-10-19 17:31:36

以下が DateTime クラスのインスタンスを生成する書式です。

new DateTime($datetime, $timezone )
パラメータ 説明
$datetime 日付/時刻を表す有効な書式の文字列(日付の書式 | 時刻の書式 | 相対的な書式)。省略するか "now" を指定すると現在時刻を取得します。
$timezone タイムゾーンを表す DateTimeZone オブジェクト。省略するか null を指定した場合は、現在のタイムゾーンが使われます。(タイムゾーンのリスト

以下は Asia/Tokyo のタイムゾーンでの現在の日時のインスタンスを生成する例です。

$current_datetime = new DateTime('now', new DateTimeZone('Asia/Tokyo'));

日時のインスタンスを作成

以下は日時を指定してインスタンスを生成する例です。

//日時のインスタンスを生成
$my_date = new DateTime('2016-10-20 12:34:56');

//生成した日時のインスタンスに format で書式を指定して出力
echo $my_date->format('Y-m-d H:i:s');  //2016-10-20 12:34:56
echo $my_date->format('Y年m月d日 H時i分s秒'); //2016年10月20日 12時34分56秒

//時刻を省略(00:00:00 が適用される)
$my_date = new DateTime('2016/10/20');
echo $my_date->format('Y/m/d H:i:s'); //2016/10/20 00:00:00

//日付を省略(現在の日付が適用される)
$my_date = new DateTime('12:34:56');
echo $my_date->format('Y/m/d H:i:s');  //2016/10/20 12:34:56

format メソッド(指定した書式で日時を返す)

format メソッドを使うと指定した書式でフォーマットした日付を返すことができます。

以下が format メソッドの書式です。

パラメータ $format には出力される日付文字列の書式を指定します。書式に使える記述子は date() 関数で使える文字と同じです。

public DateTime::format($format)

以下は年(4桁)を表す Y、月を表す m、日を表す d、曜日(省略形)を表す D の記述子を使ってフォーマットする例です。

//日時のインスタンスを生成
$date = new DateTime('2000-01-01');

//指定した書式でフォーマット
$format_date = $date->format('Y年m月d日(D)');

echo $format_date;  //2000年01月01日(Sat)

日付や時刻を設定

setDatesetTime メソッドを利用して、生成した DateTime オブジェクト(インスタンス)の日付や時刻(生成した際の基準日時)を別の日付や時刻に設定(更新)することができます。

それぞれの引数には整数を指定します。$second と $microsecond のデフォルトは 0 です(省略可能)。

どちらのメソッドもメソッドチェインに使う DateTime オブジェクトを返します。

public DateTime::setDate($year, $month, $day)

public DateTime::setTime( $hour, $minute, $second, $microsecond)

以下は現在の日時のインスタンスを生成して日時を変更する例です。

//現在の日時のインスタンスを生成
$date = new DateTime();

//日付を変更(日時はそのまま)
$date->setDate(2016,10,20);
//フォーマットして出力(u はマイクロ秒)
echo $date->format('Y/m/d H:i:s:u'); // 2016/10/20 08:58:27:169902

//現在の日時のインスタンスを生成
$date = new DateTime();

//日付と日時を変更(メソッドチェインが使える)
$date->setDate(2016,10,20)->setTime(12,34,56);
echo $date->format('Y/m/d H:i:s:u'); // 2016/10/20 12:34:56:000000

//上記は以下のようにメソッドチェインでまとめて記述することもできます
echo $date->setDate(2016,10,20)->setTime(12,34,56)->format('Y/m/d H:i:s:u');

タイムスタンプを変更 modify

modify メソッドを使って DateTime オブジェクトのタイムスタンプを変更することができます。

modify メソッドのパラメータには有効な書式の文字列(+1 day や next Monday など)を指定できます。

public DateTime::modify($modifier)
$date = new DateTime('2016-10-20');

//1日後
echo $date->modify('+1 days')->format('Y/m/d H:i:s');
// 2016/10/21 00:00:00

//1時間2分3秒後
echo $date->modify('+1 hours 2 minutes 3 seconds')->format('Y/m/d H:i:s');
// 2016/10/21 01:02:03

//1ヶ月前
echo $date->modify('-1 month')->format('Y/m/d H:i:s');
// 2016/09/21 01:02:03

//1週間と2日4時間2秒後
echo $date->modify('+1 week 2 days 4 hours 2 seconds')->format('Y/m/d H:i:s');
// 2016/09/30 05:02:05

//翌月の最初の日
echo $date->modify('first day of next months')->format('Y/m/d H:i:s');
// 2016/10/01 05:02:05

//前月の最後の日
echo $date->modify('last day of last months')->format('Y/m/d H:i:s');
// 2016/09/30 05:02:05

// 次の日曜日
echo $date->modify('sunday')->format('Y/m/d H:i:s');
//2016/10/02 00:00:00

フォーマットを指定してインスタンスを作成

コンストラクタを使った new DateTime() では日付/時刻を表す有効なフォーマットの文字列を指定する必要がありますが、静的メソッド DateTime::createFromFormat を使うと柔軟にフォーマットを指定してインスタンスを作成することができます。以下が書式です。

public static DateTime::createFromFormat($format, $datetime, $timezone)
パラメータ 説明
$format 書式を文字列で指定します。使える記述子は date() 関数で使える文字と同じ。
$datetime 日付/時刻を表す文字列
$timezone タイムゾーンを表す DateTimeZone オブジェクト
//フォーマットを作成
$format = 'Y年m月d日 H時i分s秒';

//上記で作成したフォーマットを指定してインスタンスを再生(createFromFormat は静的メソッド)
$my_date = DateTime::createFromFormat($format, '2016年10月20日 12時34分56秒');

//書式を指定して出力
echo $my_date->format('Y/m/d H:i:s');  //  2016/10/20 12:34:56

タイムゾーンの取得と設定

生成した DateTime インスタンスのタイムゾーンは getTimezone メソッドで取得できます。

インスタンスを生成する際にタイムゾーンを設定できますが、setTimezone メソッドを使って生成後に設定することができます。パラメータにはタイムゾーンを表す DateTimeZone オブジェクトを指定します。

public DateTime::getTimezone()  //パラメータなし

public DateTime::setTimezone($timezone)   //DateTimeZone オブジェクトを指定

getTimezone メソッドで取得するのは DateTimeZone オブジェクトなので、タイムゾーン名は DateTimeZone オブジェクトの getName メソッドで取得します。

DateTimeZone オブジェクトはコンストラクタにタイムゾーン名(Asia/Tokyo や America/New_York など)を指定して生成します。

$date = new DateTime();

//タイムゾーン(DateTimeZone オブジェクト)を取得
$timezone = $date->getTimezone();
//現在のタイムゾーンを出力
echo $timezone->getName(); // Asia/Tokyo
echo $date->format('Y-m-d H:i:s'); // 2016-10-20 09:50:08 (日本時間)

// タイムゾーンを米国(ニューヨーク)に変更
$date->setTimezone(new DateTimeZone('America/New_York'));
echo $date->format('Y-m-d H:i:s');  //2016-10-19 20:50:08 (ニューヨーク時間)

diff メソッド(2つの日時の差を調べる)

diff メソッドは2つの DateTime オブジェクトの差(DateInterval オブジェクト)を返します。

以下が書式で、第1パラメータには比較する日時( DateTime オブジェクト)を指定します、第2パラメータは戻り値を絶対値(正の値)で返すかどうかを真偽値で指定します(省略可能。デフォルトは false)。

public DateTime::diff($targetObject, $absolute)

以下は2つの日時の DateTime インスタンスを作成して、その差を取得する例です。取得した差は DateInterval オブジェクトなので以下では print_r() で内容を出力しています。

//日時のインスタンスを生成
$date1 = new DateTime('2016-10-20');
//日時のインスタンスを生成
$date2 = new DateTime('2016-10-25 01:23:45');

//差を取得($interval は DateInterval オブジェクト)
$interval = $date1->diff($date2);

// days プロパティを出力
echo '開始日と終了日の間の日数: ' .$interval->days;

//内容をデバッグ表示
print_r($interval);

以下が出力結果です(以下の出力は pre タグで囲んで出力しています)。

開始日と終了日の間の日数: 5

DateInterval Object //print_r($interval) の出力
(
    [y] => 0  //年
    [m] => 0  //月
    [d] => 5  //日
    [h] => 1  //時間
    [i] => 23 //分
    [s] => 45 //秒
    [f] => 0  //マイクロ秒
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 5  //diff() を使った場合の開始日と終了日の間の日数
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)

以下は DateInterval クラスのプロパティです。

DateInterval クラスのプロパティ
プロパティ 説明
y
m
d
h 時間
i
s
f マイクロ秒
invert 間隔が負の数になっている場合は 1、そうでない場合は 0
days DateTime::diff() で作られた DateInterval オブジェクトの場合は、開始日と終了日の間の日数。 それ以外の場合は false となります。

DateInterval クラスの format メソッド

DateInterval クラスの format メソッドを使って diff() で取得した値を書式を指定して出力することができます。

// 日時のインスタンスを生成
$date1 = new DateTime('2016-10-20');
// 日時のインスタンスを生成
$date2 = new DateTime('2016-10-25 01:23:45');

// 差を取得
$interval = $date1->diff($date2);

// 書式を指定して出力(%R は正負の符号、%a は総日数)
echo $interval->format('%R%a');
// +5  (出力)

// $date2 を元に差を取得して、書式を指定して出力
echo $date2->diff($date1)->format('%R%a');
// -5  (出力)

// 書式を指定して出力
echo $interval->format('%R %d日 %h時間 %i分 %s秒 の差があります');
//+ 5日 1時間 23分 45秒 の差があります  (出力)

DateInterval クラスの format メソッドには以下のような format 文字が使えます。

DateInterval クラスの format 文字
format 文字 説明
%Y 年、数値、先頭に 0 を含む 2 桁
%y 年、数値
%M 月、数値、先頭に 0 を含む 2 桁
%m 月、数値
%D 日、数値、先頭に 0 を含む 2 桁
%d 日、数値
%a DateTime::diff() の結果に使った場合は総日数
%H 時間、数値、先頭に 0 を含む 2 桁
%h 時間、数値
%I 分、数値、先頭に 0 を含む 2 桁
%i 分、数値
%S 秒、数値、先頭に 0 を含む 2 桁
%s 秒、数値
%F マイクロ秒(6桁)。足りない分は先頭が0埋めされます。
%f マイクロ秒、数値
%R 負の値の場合は "-"、正の値の場合は "+"
%r 負の値の場合は "-"、正の値の場合は空文字
%% リテラルとしての %

誕生日から年齢を算出

以下は誕生日から年齢を算出して出力する例です。

// 現在の日時のインスタンスを生成
$today = new DateTime('today');
// 誕生日の日時のインスタンスを生成
$birthday = new DateTime('1990-09-17');

// diff() で差を取得して y プロパティが年齢の値
$age = $today->diff($birthday)->y;

// 年齢を出力
echo $age.'歳です';  
日時を比較

単純に日時を比較するには、DateTime オブジェクトを比較します。

以下は2つの日時の DateTime インスタンスを生成して、比較する例です。新しい方が値が大きいと判定されます。

// 日時のインスタンスを生成
$dateTime1 = new DateTime('2016-10-01 01:23:45');
// 日時のインスタンスを生成
$dateTime2 = new DateTime('2016-10-25 01:23:45');

if ($dateTime1 == $dateTime2) {
  echo '日時は同じです';
}
if ($dateTime1 > $dateTime2) {
  echo '$datetime1 の方が新しいです';
}
if ($dateTime1 < $dateTime2) {
  echo '$datetime2 の方が新しいです'; // 表示される
}

期間により表示を変更

以下は Web ページで、ある期日を過ぎたら表示する文字を変更する例です。

以下の場合、2016年10月25日までは「これからのイベント」と表示し、それ以降は「今までのイベント」と表示します。

<?php
//表示を変更する日付で DateTime インスタンスを生成
$target_date = new DateTime('2016-10-25');
//現在の DateTime インスタンスを生成
$current_date = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
//判定用の変数
$isUpcoming = true;

//現在の DateTime インスタンスの方が新しければ変数の値を false に変更
if ($current_date >= $target_date) {
  $isUpcoming = false;
}
?>

<h3><?php echo $isUpcoming ? 'これからのイベント': '今までのイベント'; ?></h3>  

同じ日付かどうかを調べる

以下は diff() を使って、時間に関係なく同じ日付かどうかを調べる例です。

diff() で2つのインスタンスの差を取得して、その d プロパティ(または days プロパティ)が0であれば同じ日付と判定しています。

// 日時のインスタンスを生成
$dateTime1 = new DateTime('2016-10-25 01:23:45');
// 日時のインスタンスを生成
$dateTime2 = new DateTime('2016-10-25 12:34:56');

// diff() で差を取得
$diff = $dateTime1->diff($dateTime2);

// d プロパティ(または days プロパティ)が0であれば同じ日付
if ($diff->d === 0) {
  echo '日付は同じです'; // 表示される
}

異なる日付で同じ時間かどうかを調べる

以下は diff() を使って、日付に関係なく同じ時間かどうかを調べる例です。

diff() で2つのインスタンスの差を取得して、その h、i、s プロパティ(または days プロパティ)が0であれば同じ日付と判定しています。

// 日時のインスタンスを生成
$dateTime1 = new DateTime('2016-10-16 01:23:45');
// 日時のインスタンスを生成
$dateTime2 = new DateTime('2016-10-25 01:23:45');
// 差を取得
$diff = $dateTime1->diff($dateTime2);

//  h、i、s プロパティが全て0かどうかを調べて判定
if ($diff->h === 0 && $diff->i === 0 && $diff->s === 0) {
  echo '時間は同じです'; // 表示される
}

以下はマイクロ秒も調べる例です。現在の日時のインスタンスを2つ続けて生成していますが、マイクロ秒は異なります。

// 現在の日時のインスタンスを生成
$dateTime1 = new DateTime();
// 現在の日時のインスタンスを生成
$dateTime2 = new DateTime();
// 差を取得
$diff = $dateTime1->diff($dateTime2);

if ($diff->h === 0 && $diff->i === 0 && $diff->s === 0) {
  echo '時間は同じです'; // 表示される
}

// f(マイクロ秒)も比較
if ($diff->h === 0 && $diff->i === 0 && $diff->s === 0 && $diff->f === 0) {
  echo '時間は同じです(マイクロ秒も含めて)'; // 表示されない
}

DateTimeImmutable

PHP 5.5以上では DateTimeImmutable クラスが使えます。DateTimeImmutable クラスは、基本的に DateTime クラスとほぼ同じですが、自分自身は変更せずに新しいオブジェクトを返します。

以下は DateTime と DateTimeImmutable のインスタンスをそれぞれ生成して比較する例です。

DateTime クラスの場合、2度目の modify は1度目の modify の結果に対して適用されています(modify により元のインスタンス $date が変更されている)。

DateTimeImmutable クラスの場合は元のインスタンスに対して適用されています(modify により元のインスタンス $dateImmutable が変更されていない)。

// 2018-03-15 を指定して DateTime インスタンスを生成
$date = new DateTime('2018-03-15');

echo $date->modify('+5 day')->format('Y-m-d') .'<br>' ;
//2018-03-20

echo $date->modify('-10 day')->format('Y-m-d') .'<br>' ;
//2018-03-10(上記で変更された 2018-03-20 から -10 day)

// 2018-03-15 を指定して DateTimeImmutable インスタンスを生成
$dateImmutable = new DateTimeImmutable('2018-03-15');

echo $dateImmutable->modify('+5 day')->format('Y-m-d') .'<br>';
//2018-03-20

echo $dateImmutable->modify('-10 day')->format('Y-m-d') .'<br>';
//2018-03-05 (元の 2018-03-15 から -10 day) 

文字列の操作

PHP には文字列を扱う関数が豊富に用意されています。以下は、その中でよく使われるものです。

大文字・小文字の変換

アルファベットを、大文字や小文字に変換する以下のような関数があります。

関数 説明
strtoupper 文字列を大文字に変換
mb_strtoupper 文字列を大文字に変換(マルチバイト文字対応)
strtolower 文字列を小文字に変換
mb_strtolower 文字列を小文字に変換(マルチバイト文字対応)
ucfirst 文字列の最初の文字を大文字に変換
lcfirst 文字列の最初の文字を小文字に変換
ucwords 文字列の各単語の最初の文字を大文字に変換
mb_convert_case 文字列に対してケースフォールディングを行う(マルチバイト文字対応)
$upperCase = strtoupper('abc');
echo $upperCase;  // ABC

$upperCaseMB = mb_strtoupper('abc');
echo $upperCaseMB;  // ABC

$lowerCase = strtolower('XYZ');
echo $lowerCase;  // xyz

$lowerCaseMB = strtolower('XYZ');
echo $lowerCaseMB;  // xyz

$capitalized = ucfirst('capitalize');
echo $capitalized;  // Capitalize

$lowerCaseFirst = lcfirst('XYZ');
echo $lowerCaseFirst;  // xYZ

$capitalizedWords = ucwords('abc xyz');
echo $capitalizedWords;  //Abc Xyz

$capitalizedWords2 = ucwords('abc,xyz');
//デフォルトの単語の区切り文字はスペースや改行など(" \t\r\n\f\v")
echo $capitalizedWords2;  //Abc,xyz

$capitalizedWords3 = ucwords('abc,xyz'," \t\r\n\f\v," );
//デフォルトの区切り文字にカンマを追加
echo $capitalizedWords3;  //Abc,Xyz

$MBcaseTitle = mb_convert_case('abc xyz', MB_CASE_TITLE, "UTF-8");
//第2パラメータ:変換モード、第3パラメータ:文字エンコーディング
echo $MBcaseTitle;  //Abc Xyz

/*第2パラメータに指定できる変換モード
MB_CASE_UPPER
MB_CASE_LOWER
MB_CASE_TITLE
MB_CASE_FOLD
MB_CASE_UPPER_SIMPLE
MB_CASE_LOWER_SIMPLE
MB_CASE_TITLE_SIMPLE
MB_CASE_FOLD_SIMPLE*/

文字列の置換

str_replace() は文字列中のある文字列を、別の文字列にするときに使用します。以下が構文です。

str_replace ( $search, $replace, $subject [,&$count ] )

パラメータ

  • search:探したい値(置換前の文字列)。needle (針) と呼ばれることもあります。 配列を使えば、複数の値を指定することもできます。
  • replace:見つかった search を置き換える値(置換後の文字列)。 配列を使えば、複数の値を指定することもできます。
  • subject:検索・置換の対象となる文字列あるいは配列(元の文字列)。 haystack (干し草の山) と呼ばれることもあります。subject が配列の場合、 subject の各エントリについて検索と置換が行われ、 返り値は同様に配列となります。
  • count:指定した場合は、マッチして置換が行われた箇所の個数がここに格納されます。

戻り値

この関数は、置換後の文字列あるいは配列を返します。

以下は、LA と言う文字列を NY に置換する例です。

<?php
echo str_replace("LA", "NY", "LA is cool.");
?>
NY is cool.

配列を配列で置換

search(置換前の文字列) と replace(置換後の文字列) が配列の場合、str_replace() は各配列から値をひとつ取り出し、 subject(元の文字列) 上で検索と置換を行うために使用します。 replace の値が search よりも少ない場合、 置換される値の残りの部分には空の文字列が使用されます。「連想配列の利用」も参照ください。

<?php
$before = array("foo", "bar");
$after = array("dog", "cat");
echo str_replace($before, $after, "foo is not bar");
?>
dog is not cat

検索文字列が配列で、置き換える値が文字列の場合

search(検索文字列) が配列で replace( search を置き換える値) が文字列の場合、この置換文字列が search の各値について使用されます。しかし、 逆の場合(search が文字列で replac が配列の場合)はエラー(Notice: Array to string conversion)になります。

<?php
$before = array("foo", "bar");
$after = "***";
echo str_replace($before, $after, "foo is not bar");
?>
*** is not ***

元の文字列が配列の場合

subject(元の文字列) が配列の場合、 subject の各エントリについて検索と置換が行われ、 返り値は同様に配列となります。

<?php
$original_strings = array("Java is not PHP", "Java is fun");
$replaced_strings = str_replace("Java", "JavaScript", $original_strings);
foreach($replaced_strings as $value) {
  echo "$value <br>";
}
JavaScript is not PHP
JavaScript is fun

置換された回数の取得

第3パラメータ count を指定した場合は、マッチして置換が行われた箇所の個数が countに格納されます。

<?php
echo str_replace("abc", "xxx", "abcdefgabchulhabxcbabcdyt", $count) ."<br>";
echo $count. "回置換されました。";
?>
xxxdefgxxxhulhabxcbxxxdyt
3回置換されました。

連想配列の利用

キーに「探したい値(置換前の文字列)」を、値に「置き換える値(置換後の文字列)」を指定した連想配列を使って以下のように使うこともできます。

連想配列を $convert とすると、第一引数(search)には、array_keys($convert)を指定して、第二引数(replace)には array_values($convert) を指定します。

array_keys() は連想配列のキーを取得する関数で、array_values() は連想配列の値を取得する関数です。以下の場合、array_keys($convert) には配列 $convert のキーの配列が、array_values($convert) には配列 $convert の値の配列が入っています。

<?php
$convert = ['green' => 'blue', 'red' => 'orange'];
$subject = 'green is not red.';

echo str_replace(array_keys($convert), array_values($convert), $subject);
//blue is not orange. と出力されます。
?>

※ 但し、以下のように指定すると期待していた結果にはならないかも知れません。

<?php
$convert = ['green' => 'blue', 'red' => 'orange', 'blue' => 'purple'];
$subject = 'green is not red and blue is not yellow.';

echo str_replace(array_keys($convert), array_values($convert), $subject);
//purple is not orange and purple is not yellow. と出力されます。
?>

「green」は「blue」に置換された後に、'blue' => 'purple' により再度変換されて結果としては「purple」に変換されてしまいます。

str_replace() は左から右へと置換を行うので、 複数の置換を行うときには、置換された値を再度置換する可能性もあるので注意が必要です。

一度置換された値は、再度置換させたくない場合は strtr() を使用します。

文字の変換(部分文字列の置換)

strtr() は文字の変換あるいは部分文字列の置換を行う関数です。一度置換した文字列は再度置換されません(置換の対象になりません)。

以下が構文で、パラメータを3つ指定した場合と、2つ指定した場合では動作が異なります。

パラメータを3つ指定する場合
strtr ( $str , $from , $to )

パラメータ

  • $str:変換する文字列。
  • $from :to に変換される文字列(検索文字列)。
  • $to:from を置換する文字列(置換文字列)。

$str の中の検索文字列($from)を置換文字列($to)に置換します。検索文字列($from)と置換文字列($to)の長さが同じでない場合は、長い方の余分な文字は無視されるので期待通りの結果にならないかも知れません。

<?php echo strtr("It was 1982.", "1982", "2001"); ?>
//It was 2001. と出力

以下は、検索文字列($from)と置換文字列($to)の長さが同じでない場合の例です。

<?php echo strtr("New York is NY and not LA.", "New York", "LA"); ?>
//LAw York is LY and not LA と出力

パラメータを2つ指定する場合
strtr ( $str , $replace_pairs ) 

パラメータ

  • $str:変換する文字列。
  • $replace_pairs :連想配列のキーに「検索文字列」、値に「置換文字列」を指定します。

第二引数に「検索文字列」と「置換文字列」から成る連想配列を指定する例です。この場合、文字の長さは関係なくその該当する文字列部分が置換文字列で置換されます。

<?php
$trans = array("New York" => "LA");
echo strtr("New York is NY and not LA.", $trans);
?>
//LA is NY and not LA. と出力

以下の場合、この関数は一度置換した文字列は再度置換しないので、str_replace() とは異なり、green から blue に置換された後に更に purple に変換されることはありません。

<?php
$convert = ['green' => 'blue', 'red' => 'orange', 'blue' => 'purple'];
$subject = 'green is not red and blue is not yellow.';

echo strtr($subject, $convert);
?>
//blue is not orange and purple is not yellow. と出力

文字列の取り出し

substr() は、文字列中の「何文字目から何文字分」取り出したいときに使用します。以下が構文です。

substr( $string , $start [,$length ] )

文字列 string の、start で指定された位置から length バイト分の文字列を返します。

パラメータ

  • string:入力文字列。最低 1 文字以上を指定しなければなりません。
  • start
    • 正の場合、返される文字列は、 string の 0 から数えて start番目から始まる文字列となります。 例えば、文字列'abcdef'において位置 0にある文字は、'a'であり、 位置2には'c'があります。
    • start が負の場合、返される文字列は、 stringの後ろから数えて start番目から始まる文字列となります。
    • string の長さが start 文字より短い場合は FALSE が返されます。
  • length:(オプション)
    • length が指定され、かつ正である場合、 返される文字列は start から数えて length 文字数分となります。
    • length が指定され、かつ負である場合、 string の終端からその文字数分の文字が省略されます。 もし start が切り出し位置を超える場合、 FALSE が返されます。
    • length を省略した場合は、 start の位置から文字列の最後までの部分文字列を返します。
    • length が指定され、かつ 0、NULL、もしくは FALSE であれば、空の文字が返されます。

以下は半角文字の場合の簡単なサンプルです。

<?php
echo substr("abcdefg", 2, 3). "<br>";
echo substr("abcdefg", 3). "<br>";
?>
cde
defg

start(開始位置) が負の場合

start(開始位置) が負の場合、返される文字列は、string の後ろから数えて start 番目から始まる文字列となります。

<?php
echo substr("abcdefg", -5, 3). "<br>";
echo substr("abcdefg", -4). "<br>";
?>
cde
defg

length(取り出す文字数)が負の場合

length(取り出す文字数)がマイナスの場合、そのマイナス文字数分を除いた、開始位置からの文字列が取り出されます。

<?php
echo substr("abcdefg", 2, -3). "<br>";
echo substr("abcdefg", -4, -2). "<br>";
?>
cd
de

全角文字を含む場合

全角文字は、半角2桁が1文字分なので substr() では文字化けを起こす可能性が高いです。substr() の代わりに、次項のマルチバイト文字に対応した mb_substr() を使用します。

mb_substr() 関数は、マルチバイトでも各一文字をカウントして、指定された長さにして返します。 日本語を含む文字列操作はこちらを使ったほうが良いでしょう。

<?php
echo substr("あいうえおかきくけこ", 4, 2). "<br>";
echo mb_substr("あいうえおかきくけこ", 4, 2). "<br>";
?>

おか

マルチバイト文字列の取り出し

mb_substr() は文字数に基づきマルチバイト対応の substr() 処理を行います。以下が構文です。substr() とほぼ同じですが、文字エンコーディングを指定できるパラメータがあります。

mb_substr ( $str, $start [, $length [, $encoding ]] )

パラメータ

  • str:部分文字列を取り出したい文字列。
  • start
    • start が正である場合に返される文字列は、 string の start バイト目以降の文字列となります (ゼロから数えます)。 たとえば、文字列 'abcdef' の 0 バイト目は 'a' で、 2 バイト目は 'c' のようになります。
    • start が負の数の場合に返される文字列は、 string の後ろから数えて start バイト目以降となります。
  • length:str の中から取り出す最大文字数。 省略したり NULL を渡したりした場合は、 文字列の最後までの全バイトを取り出します。
  • encoding:encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

以下の例は、substr() では文字化けを起こしていましたが、encoding パラメータを適切に指定することで mb_substr() では問題なく表示されます。

<?php
echo mb_substr("あいうえおかきくけこ", 4, 4, 'UTF-8');
?>
おかきく

但し、encoding パラメータを指定する場合、第3パラメータの length を省略することができません。そのような場合は、以下のように、mb_language()mb_internal_encoding() を指定することで、文字化けを回避できます。

<?php
mb_language('Japanese');
mb_internal_encoding('UTF-8');
echo mb_substr("あいうえおかきくけこ", 4);
?>
おかきくけこ

フォーマット済み文字列の出力

printf() / sprintf() は、文字列や数値などを、ある特定のフォーマット(形式)で整形して出力(表示)する場合に試用します。

printf() と sprintf() の違いは、printf() は整形された内容を出力するのに対し、sprintf() は整形された内容の文字列を返します(出力はしません)。また、printf() は出力した文字列の長さを返します。

以下がそれぞれの構文です。

int printf ( $format, $args [, $... ])
string sprintf ( $format, $args [, $... ])

パラメータ

$format
フォーマット文字列:変換形式(フォーマット)を含む文字列
$args
フォーマット文字列中のフォーマットに対応する値

フォーマット文字列($format)の中の %s などのフォーマット部分を、パラメータ($args)に指定した値で置き換えて整形します。

<?php
  $output = sprintf(
    '<%s style="color:%s">%s</%s>', //フォーマット文字列(第1パラメータ $format)
    'p', //1番目の %s に指定する値($args)
    '#999', //2番目の %s に指定する値($args)
    'テスト文字列', //3番目の %s に指定する値($args)
    'p' //4番目の %s に指定する値($args)
  );
  echo $output;
?>

上記の例の場合、echo される $output は以下のようになります。

<p style="color:#999">テスト文字列</p>

以下の場合、2つの値(%d と %s)を変換するので対象となる2つの値(数値と文字列)を指定します。

sprintf("庭に %d 匹の %s がいます。", 値1, 値2);
  • フォーマット文字列($format):"庭に %d 匹の %s がいます。"
  • %d に値1(数値)を、 %s に値2(文字列)を指定して整形

フォーマットが決まっていて、文字列中に含める特定の文字のみが変化する場合に利用すると便利です。

<?php
echo sprintf("庭に %d 匹の %s がいます。", 3, "猫");   //sprintf
printf("庭に %d 羽の %s がいます。", 2, "ニワトリ");   //printf
?>  
庭に 3 匹の 猫 がいます。
庭に 2 羽の ニワトリ がいます。

変換形式(フォーマット)の指定方法

フォーマットは、以下のような書式で指定します。

%[符号指定子] [パディング指定子] [アラインメント指定子] [表示幅指定子] [精度指定子] 型指定子

最後の型指定子以外はオプションです。以下は、変換指定子の概要です。

変換指定子 概要
符号指定子 数値で符号 (- あるいは +) を使用するよう指定します。 デフォルトでは、数値が負の場合の - 符号のみが使用されます。 この指定子により、正の数にも強制的に + 符号をつけることができます。
パディング指定子 文字列が正しい長さになるまでどんな文字で埋めるかということを 指定します。これは空白かまたは 0 (文字 '0') のいずれかです。デフォルトでは空白で埋められます。 これ以外のパディング文字を指定するには、その文字の前に 単一引用符 (') を置きます。
アラインメント指定子 結果を左寄せまたは右寄せにしたい場合に指定します。 デフォルトは右寄せです。ここで - 文字を指定すると左寄せとなります。
表示幅指定子 結果を(最低)何桁にするかを指定します。
精度指定子 ピリオド (.) に続けてオプションで桁数指定文字列を書いたもので、浮動小数点数に対して数字を何桁まで表示するかを指定します。 文字列に対して使用した場合は、これは切り捨て位置として働きます。
型指定子 引数を何の型として扱うかを指定します。 指定できる型は次の表を参照。

型指定子

型指定子は必須の指定子で、「%」の後に指定したい型に対応する1文字を記述します。以下は型指定子として指定できる値です。

型指定子 意味
% パーセント文字。引数は不要です。
b 引数を整数として扱い、 2 進数として表現します。
c 引数を整数として扱い、その ASCII 値の文字として表現します。
d 引数を整数として扱い、 10 進数として表現します。
e 引数を科学記法として扱います (例 1.2e+2)。
E %e と同じですが、 大文字を使います (例 1.2E+2)。
f 引数を double として扱い、 浮動小数点数として表現します。
F 引数を float として扱い、 浮動小数点数として表現します (ロケールに依存しません)。
g %e および %f の短縮形。
G %E および %f の短縮形。
o 引数を整数として扱い、 8 進数として表現します。
s 引数を文字列として扱い、表現します。
u 引数を整数として扱い、符号無しの 10 進数として表現します。
x 引数を整数として扱い、16 進数として (小文字で)表現します。
X 引数を整数として扱い、16 進数として (大文字で)表現します。

小数点以下の桁の整形

浮動小数点数の小数点以下の桁を指定して表示することができます。浮動小数点数の型指定子は「f」で、小数点以下の桁は「精度指定子」で指定します。

<?php
$data = 12345.6789;
printf("%.2f<br>", $data);  //小数点以下2桁
printf("%.3f<br>", $data);  //小数点以下3桁
printf("%+.4f<br>", $data);  //小数点以下4桁と符号指定子(+)を指定
?>
12345.68
12345.679
+12345.6789

日付の先頭に 0 を付ける

型指定子は「d」の整数を使用し、パディング指定子で「0」を指定し、表示幅指定子で「2」を指定して2桁にします。

<?php
echo sprintf("%02d月%02d日", 4, 7). "<br>";
echo sprintf("%02d月%02d日", 12, 5);
?>
04月07日
12月05日

フォーマット文字列内で % を文字として表示

パーセント記号(%)は変換指定子なので、文字のパーセント記号(%)を表示するには「%%」と記述します。

<?php
printf("%%b = '%b'\n", 387); //387 を 2 進表現
?>
%b = '110000011'

位置指定子

通常、フォーマット文字列内の変換指定子は、渡された引き数が順番に割り当てられます。しかし、変換指定子のパーセント記号(%)の直後に位置指定子(引数番号と$記号)で番号付けをすることにより、割り当ての順番を交換することができます。

また、番号付けされた変換指定子は、同じフォーマット文字列内で複数回使用することができます。

位置指定子を使用する場合は、シングルクォートを使用します。

<?php
echo sprintf("庭に %d 匹の %s がいます。<br>", 3, "猫");
echo sprintf('%2$s が庭に %1$d 匹います。', 3, "猫");
?>
庭に 3 匹の 猫 がいます。
猫 が庭に 3 匹います。

フォーマットに従って値を取得

sscanf() は、指定したフォーマットに従って、文字列の中の値を取得します。sprintf() とは逆の関係になります。以下が構文です。

mixed sscanf ( $str, $format [, &$(変数)... ] )

パラメータ

  • str:入力文字列。
  • format:str を解釈するフォーマット。
    sprintf() のフォーマットと比べて、以下の違いがあります。
    • ロケールに対応していません。
    • F、g、G および b はサポートしていません。
    • D は十進数値を表します。
    • i は基数検出つきの整数値を表します。
    • n は処理する文字数を表します。
  • ...: オプションで指定する参照渡しの変数に、 パースされた値が格納されます。実施の使用では「&」は付けません。

戻り値

パラメータが二つだけの場合、処理された値は配列として返されます。 それ以外の場合は、もしオプションのパラメータ(変数)が渡されればこの関数は 割り当てられた値の数を返します。

以下は、「S/N: ****」というフォーマット済み文字列の「****」の部分を取得します。

<?php
$sn = sscanf("S/N:0001, S/N:0002", "S/N:%d, S/N:%d");
foreach($sn as $key => $value) {
  echo '$sn[' . $key. '] : '. $value . '<br>';
}
?>

%d で数値として取り出され、配列 $sn に格納されます。

$sn[0] : 1
$sn[1] : 2

以下は、オプションのパラメータ(変数)を使用する例です。

<?php
sscanf("S/N:0001, S/N:0002", "S/N:%d, S/N:%d", $val1, $val2);
echo '$val1: '. $val1 . '<br>';
echo '$val2: '. $val2 . '<br>';
?>
$val1: 1
$val2: 2

日付から取得するときにも使うことができます。

<?php
sscanf("2015年10月26日", "%d年%d月%d日", $year, $month, $day);
echo  '$year: '. $year . '<br>';
echo  '$month: '. $month . '<br>';
echo  '$day: '. $day . '<br>';
?>
$year: 2015
$month: 10
$day: 26

文字列を区切る

explode() は、区切り文字列により文字列を分割します。以下が構文です。

array explode ( $delimiter, $string [,$limit ] )

パラメータ

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

戻り値

string の内容を delimiter で分割した文字列の配列を返します。

空の文字列 ("") が delimiter として使用された場合、 explode() は FALSE を返します。delimiter に引数 string に含まれていない値が含まれている場合は、 limit が負の値なら空の配列、そうでなければ 引数 string を含む配列を返します。

以下は、日付を「/」の位置で区切る場合の例です。

<?php
$ymd = explode("/", "2020/2/15");
foreach($ymd as $key => $value) {
  echo '$ymd[' . $key . "] : " . $value . '<br>';
}
?>
$ymd[0] : 2020
$ymd[1] : 2
$ymd[2] : 15

オプションの limit を指定すると、区切ったときにできる配列の要素の数を指定できます。

<?php
$ymd1 = explode("/", "2020/2/15", 1);
foreach($ymd1 as $key => $value) {
  echo '$ymd1[' . $key . "] : " . $value . '<br>';
}
echo '<br>';
$ymd2 = explode("/", "2020/2/15", 2);
foreach($ymd2 as $key => $value) {
  echo '$ymd2[' . $key . "] : " . $value . '<br>';
}
echo '<br>';
$ymd3 = explode("/", "2020/2/15", 3);
foreach($ymd3 as $key => $value) {
  echo '$ymd3[' . $key . "] : " . $value . '<br>';
}
echo '<br>';
$ymd4 = explode("/", "2020/2/15", -2);
foreach($ymd4 as $key => $value) {
  echo '$ymd4[' . $key . "] : " . $value . '<br>';
}
?>

limit に負の値を指定すると、-limit 個の要素を除いた要素が返ります。

$ymd1[0] : 2020/2/15

$ymd2[0] : 2020
$ymd2[1] : 2/15

$ymd3[0] : 2020
$ymd3[1] : 2
$ymd3[2] : 15

$ymd4[0] : 2020

文字列を結合

implode() は、explode() の逆で、配列要素を文字列により連結します。以下が構文です。

string implode ( $glue, $pieces )

パラメータ

  • glue:デフォルトは空文字列です。
  • pieces:連結したい文字列の配列。

戻り値

すべての配列要素の順序を変えずに、各要素間に glue 文字列をはさんで 1 つの文字列にして返します。

以下は、日付を explode() で「/」の位置で区切ったものを、implode() で「-」で結合する例です。

<?php
$date = implode("-", explode("/", "2020/2/15"));
echo $date;
?>
2020-2-15

同じ文字列を反復

str_repeat() は同じ文字列を反復する関数です。以下が構文です。

string str_repeat ( $input, $multiplier )

パラメータ

  • input:繰り返す文字列。
  • multiplier:input を繰り返す回数。multiplier は 0 以上でなければなりません。 multiplier が 0 に設定された場合、この関数は空文字を返します。

戻り値

繰り返した文字列を返します。

以下のように棒グラフのような出力をするときに便利です。

<?php
echo "成績A:" . str_repeat("*", 5). "<br>";
echo "成績B:" . str_repeat("*", 15). "<br>";
?>
成績A:*****
成績B:***************

空白文字の除去

trim() は、文字列の先頭および末尾にあるホワイトスペースを取り除きます。以下が構文です。

string trim ( $str [, $character_mask] )

パラメータ

  • str:ホワイトスペースを取り除く文字列
  • character_mask:このパラメータにより、削除する 文字を指定することも可能です。削除したい全ての文字をリストにします。..を文字の範囲を指定する際に 使用可能です。

戻り値

ホワイトスペースを取り除いた文字列

この関数は str の最初および最後から空白文字を取り除き、 取り除かれた文字列を返します。2番目のパラメータを指定しない場合、 trim() は以下の文字を削除します。

  • " " (ASCII 32 (0x20)), 通常の空白。
  • "\t" (ASCII 9 (0x09)), タブ。
  • "\n" (ASCII 10 (0x0A)), リターン。
  • "\r" (ASCII 13 (0x0D)), 改行。
  • "\0" (ASCII 0 (0x00)), NULバイト
  • "\x0B" (ASCII 11 (0x0B)), 垂直タブ

ブラウザからユーザーが入力した文字は、空白が入っている場合があり、データとして扱う際には、空白の除去処理を行うのが良いでしょう。

<?php
$text = "  abc  ";
echo "<pre>";
echo $text . "<br>";
echo trim($text);
echo "</pre>";
?>
  abc  
abc

全角の空白と半角の空白が混在している場合

trim() は半角のスペースは除去してくれますが、全角のスペースは除去しません。文字列の先頭、末尾にある半角・全角スペースを 除去するには、オプションの「character_mask」に全角の空白と半角の空白を指定すると、削除できる場合があります。それがうまく機能しない場合は、正規表現を使う方法があります。

<?php
$text = "         abc      ";
echo "<pre>";
echo $text . "<br>";
echo trim($text, "  "); //"全角の空白と半角の空白"を指定
echo "</pre>";
?>
         abc      
abc

正規表現を使って半角・全角スペースを除去

先頭の半角・全角スペースの除去は以下のようにします。

$str = preg_replace('/^[  ]+/u', '', $str);
  • ^[  ] で行頭が半角スペース、または全角スペースで始まる文字に一致させます。[] の中は、半角と全角のスペース。
  • + で直前の文字の1回以上の繰り返しに一致させます。

末尾の半角・全角スペースの除去は以下のようにします。

$str = preg_replace('/[  ]+$/u', '', $str);
  • [  ]+ で半角スペース、または全角スペースの1回以上の繰り返しに一致させます。[] の中は、半角と全角のスペース。
  • $ は末尾を示すので末尾が半角全角スペースの場合に一致します。

以下のように関数にしておくと便利です。

<?php
function trim_spaces ($str) {
    // 行頭の半角、全角スペースを、空文字に置換
    $str = preg_replace('/^[  ]+/u', '', $str);
    // 末尾の半角、全角スペースを、空文字に置換
    $str = preg_replace('/[  ]+$/u', '', $str);
    return $str;
}
$text = "         abc      ";
echo "<pre>";
echo $text . "<br>";
echo trim_spaces($text) ;
echo "</pre>";
?>
         abc      
abc

カンマ区切りの文字列から半角スペースを除去

「apple, banana , orange 」のような文字列のカンマで区切られたそれぞれの値の前後の半角スペースを除去する例です。

3行目:explode() で $keywords の文字列をカンマで分割して配列に変換し、array_map() でそれぞれの要素の前後のスペースを除去しています。

4行目:スペースを除去した文字列の配列を implode() でカンマ区切りの文字列に変換しています。

<?php
$keywords = 'apple, banana , orange  ';
$array_keywords = array_map('trim', explode(',', $keywords) );
$trimmed_keywords = implode(',', $array_keywords);

print_r($keywords);
echo '<br>';
print_r($trimmed_keywords);
?>
apple, banana , orange  
apple,banana,orange

全角のスペースも除去するには、前述の「正規表現を使って半角・全角スペースを除去」で作成した関数と array_map() を使います。

<?php
//半角・全角スペースを除去する関数
function trim_spaces ($str) {
    $str = preg_replace('/^[  ]+/u', '', $str);
    $str = preg_replace('/[  ]+$/u', '', $str);
    return $str;
}

$keywords = ' apple ,  banana  ,  orange  ';
$array_keywords = array_map('trim_spaces', explode(',', $keywords) );
$trimmed_keywords = implode(',', $array_keywords);

print_r($keywords);
echo '<br>';
print_r($trimmed_keywords);
?>
 apple ,  banana  ,  orange  
apple,banana,orange

改行の削除・変換

trim() では文字列の先頭および末尾の改行コードを除去することができますが、途中にある改行は除去することができません。

改行コードを表す特殊文字(改行コード)には以下があるようです。

  • Unix/Linux: \n (LF ラインフィード)
  • Macintosh:\r (CR キャリッジリターン)
  • Windows:\r\n または \n (CR + LF)

str_replace() で改行を削除

str_replace() を使って改行を削除することができます。

以下は PHP_EOL(OS に対応する改行コードを出力する定数)を使って $text に含まれる改行を空文字に変換する例です。

$text = str_replace(PHP_EOL, '', $text);

上記の PHP_EOL を利用する方法では全ての改行を変換することができばい場合もあります。

str_replace() の第1パラメータに配列を指定する場合、左から順番に処理を行うため以下のように記述すると全ての改行コードを変換してくれます。

以下は全ての改行を半角スペースに変換する例です。

$text = str_replace(array("\r", "\n"), ' ', $text);

preg_replace() で改行を削除

以下は preg_replace() を使って改行を空文字に変換する例です。以下の場合、第1パラメータは正規表現になるのでデリミター(以下の場合は /)が必要です。

$text = preg_replace('/\n|\r|\r\n/', '', $text );

文字列の長さの取得

strlen() は、文字列の長さ(バイト数)を取得します。以下が構文です。

int strlen ( $string )

パラメータ

string:長さを調べる文字列。

戻り値

成功した場合に string の長さ、 string が空の文字列だった場合に 0 を返します。

注意: strlen() が返すのはバイト数であり、 文字数ではありません。文字数を取得するには mb_strlen() を使用します。

<?php
$text = "abc@#^XYZ12";
$kana = "あいうえお";
echo strlen($text). "<br>";
echo strlen($kana). "<br>";
?>
11
15

mb_strlen() マルチバイト文字列の長さの取得

strlen() では、日本語のようなマルチバイト文字列の長さを正確に取得することはできないので、mb_strlen() を使用します。以下が構文です。

mixed mb_strlen ( $str [,$encoding ] )

パラメータ

  • str:長さを調べたい文字列。
  • encoding:文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

戻り値

文字エンコーディング encoding の文字列 str の文字数を返します。 マルチバイト文字の一文字は1個として数えられます。

<?php
$text = "abc@#^XYZ12";
$kana = "あいうえお";
$mix = "abかき&文字数";
echo mb_strlen($text). "<br>";
echo mb_strlen($kana). "<br>";
echo mb_strlen($mix). "<br>";
?>
11
5
8

ユーザーが入力した値の長さをチェックしたりするのに利用できます。

mb_strlen() の注意点

mb_strlen() 関数を使用して期待した値が返されない場合があります。これは、PHP の内部エンコーディングと文字列のエンコーディングが異なっている場合に起きます。その場合、第2パラメータに文字エンコーディングを指定します。

mb_strlen ( "文字列",'UTF-8' )

文字列の位置を検索

ある文字列の中で特定の部分文字列が出現する位置を取得するには、mb_strpos() または mb_strrpos() を利用します。

  • mb_strpos() :文字列の先頭(または、指定されたオフセット位置)から後方に向けて検索し、指定された部分文字列が初めて出現した位置を返します。
  • mb_strrpos() :文字列の末尾から前方に向けて検索し、指定された部分文字列が初めて出現した位置を返します。(言い換えると、文字列の中に指定した文字列が最後に現れる位置を返します。)

以下が構文です。

int mb_strpos ( $haystack , $needle [, $offset [, $encoding ]] )
int mb_strrpos ( $haystack , $needle [, $offset [, $encoding ]] )

パラメータ

  • haystack:調べたい文字列。
  • needle:haystack(調べたい文字列)の中から探す文字列。
  • offset:検索オフセット。 指定されない場合は、0 が使用されます。
  • encoding:文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

戻り値

  • mb_strpos() の場合:文字列 haystack の中で needle が最初に現れる位置を数字で返します。 needle が見付からなかった場合、FALSE を返します。
  • mb_strrpos() の場合:文字列 haystack の中で needle が最後に現れる位置を数字で返します。 needle が見付からなかった場合、FALSE を返します。

以下は簡単なサンプルです。

<?php
$str = "サンプル:Java と JavaScript は別物です。";
echo "前方検索 mb_strpos: ". mb_strpos($str, "Java"). "文字目<br>";
echo "前方検索(オフセット 11) mb_strpos: ". mb_strpos($str, "Java", 11). "文字目<br>";
echo "後方検索 mb_strrpos: ". mb_strrpos($str, "Java"). "文字目<br>";
?>    
前方検索 mb_strpos: 5文字目
前方検索(オフセット 11) mb_strpos: 12文字目
後方検索 mb_strrpos: 12文字目

日本語の変換

日本語(マルチバイト文字列)環境で、文字列をカタカナからひらがな、全角文字から半角文字などの変換には、mb_convert_kana() 関数が利用できます。

以下が構文です。

string mb_convert_kana ( $str [, $option [, $encoding ]] )

パラメータ

  • str:変換される文字列。
  • option:変換オプション。デフォルトは "KV" 。(以下の表を参照)
  • encoding:文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

戻り値

変換後の文字列を返します。

変換オプション

オプションは必要に応じて、組み合わせて指定することができます。(互いに矛盾しないように指定する必要があります)

使用可能な変換オプション
オプション 意味
r 「全角」英字を「半角」に変換します。
R 「半角」英字を「全角」に変換します。
n 「全角」数字を「半角」に変換します。
N 「半角」数字を「全角」に変換します。
a 「全角」英数字を「半角」に変換します。
A 「半角」英数字を「全角」に変換します。
s 「全角」スペースを「半角」に変換します。
S 「半角」スペースを「全角」に変換します。
k 「全角カタカナ」を「半角カタカナ」に変換します。
K 「半角カタカナ」を「全角カタカナ」に変換します。
h 「全角ひらがな」を「半角カタカナ」に変換します。
H 「半角カタカナ」を「全角ひらがな」に変換します。
c 「全角カタカナ」を「全角ひらがな」に変換します。
C 「全角ひらがな」を「全角カタカナ」に変換します。
V 濁点付きの文字を一文字に変換します。"K", "H" と共に使用します。

以下は、簡単なサンプルです。

<?php
echo "元の文字列:123ABCdefg4567 → 変換後:" . mb_convert_kana("123ABCdefg4567", "A") ."<br>";
echo "元の文字列:あいうえお → 変換後:" . mb_convert_kana("あいうえお", "C");
?>
元の文字列:123ABCdefg4567 → 変換後:123ABCdefg4567
元の文字列:あいうえお → 変換後:アイウエオ

ユーザーが半角カタカナで入力したデータを全角カタカナに変換したり、全角で入力された電話番号やメールアドレスを変換したりするのに便利です。

文字コードを変換

通常アプリケーション内の文字コードは特定の文字コード1つに制約するのが原則ですが、外部のファイルやデータベース、外部サイトのコンテンツを利用するような場合は、アプリケーション内部で明示的に文字コードを変換しなければならないことがあります。

マルチバイト文字列関数で、文字コード変換の機能を行うのは、mb_convert_encoding() と mb_convert_variables() です。

mb_convert_encoding() は、指定されたスカラー変数の文字コードを変換するのに対して、mb_convert_variables() は非スカラー変数(配列はオブジェクトなどの構造化データ)の文字コードを変換します。

それぞれの構文と使用例は以下の通りです。

mb_convert_encoding()

string mb_convert_encoding ( $str ,$to_encoding [,$from_encoding] )

パラメータ

  • str:変換する文字列。
  • to_encoding:str の変換後の文字エンコーディング。
  • from_encoding:変換前の文字エンコーディング名を指定します。 これは、配列またはカンマ区切りの文字列とすることが可能です。 from_encoding を指定しなかった場合は、内部文字エンコーディングを使用します。

戻り値

変換後の文字列を返します。

以下はサンプルです。

<?php
$str = "元の文字列";
echo $str."<br>";
/* 内部文字エンコーディングからJISに変換 */
$str = mb_convert_encoding($str, "JIS");
echo $str."<br>";
/* JISからUTF-8に変換 */
$str = mb_convert_encoding($str, "UTF-8", "JIS");
echo $str."<br>";
?>
元の文字列
$B85$NJ8;zNs(B
元の文字列

mb_convert_variables()

string mb_convert_variables ( $to_encoding , $from_encoding , &$vars [, &$... ] )

パラメータ

  • to_encoding:文字列の変換後のエンコーディング。
  • from_encoding:from_encoding には配列またはカンマ区切りの文字列を指定し、 from-coding からエンコーディングの検出を試みます。 from_encoding が省略された場合、detect_order を使用します。
  • vars:vars(3番目以降の引数)は、変換する変数への リファレンスです。文字列、配列、オブジェクトを指定することが可能です。 mb_convert_variables() は全てのパラメータが 同じエンコーディングを有することを仮定します。

戻り値

成功時に変換前の文字エンコーディングを返し、失敗した場合に FALSE を返します。

以下はサンプルです。

<pre>
<?php
$array = array("あ", "い", "う");
print_r($array);
mb_convert_variables("JIS", "UTF-8", $array);
print_r($array);
mb_convert_variables("UTF-8", "JIS", $array);
print_r($array);
?>
</pre>
Array
(
    [0] => あ
    [1] => い
    [2] => う
)
Array
(
    [0] => $B$"(B
    [1] => $B$$(B
    [2] => $B$&(B
)
Array
(
    [0] => あ
    [1] => い
    [2] => う
)

クエリ文字列を解析し変数に格納

parse_str() 関数は、クエリ文字列を解析(parse)して変数に格納します。以下が構文です。

void parse_str( $str [, &$arr ] )

パラメータ

  • str(string):入力文字列。
  • arr(array): 解析した文字列を格納する配列を指定します(オプション 必須)。指定しない場合(デフォルト)は、クエリ文字列の変数に値を格納します。

戻り値

値を返しません。

クエリ文字列は、「変数」と「値」からなり、各変数名と値を & でつないだ形式になっています。例えば Google で PHP と検索すると、その URL は以下のようになっています。

https://www.google.co.jp/search?q=PHP&ie=utf-8&oe=utf-8&hl=ja

上記 URL の「?」以降がクエリ文字列です。

以下は、parse_str() 関数のサンプルです。

<?php
//クエリ文字列
$query_string = "data1=PHP&data2=JavaScript&data3=jQuery";

/* PHP 8.0.0 以降では、第2パラメータの指定が 必須 になっています。以下はエラーになります。
echo "第2パラメータ指定なし<br>";
parse_str($query_string);

echo $data1 . "<br>";
echo $data2 . "<br>";
echo $data3 . "<br><br>";
*/

echo "第2パラメータに \$output を指定<br>";
parse_str($query_string, $output);

echo $output['data1'] . "<br>";
echo $output['data2'] . "<br>";
echo $output['data3'] . "<br>";
?>
</div>
第2パラメータに $output を指定
PHP
JavaScript
jQuery

クエリ文字列に配列を使用することもできます。

<?php
$query_string = "key=value&arr[]=foo+bar&arr[]=baz&arr2[]=Java&arr2[]=PHP+JavaScript";

parse_str($query_string, $output);

echo $output['key'] . "<br>";
echo $output['arr'][0] . "<br>";
echo $output['arr'][1] . "<br>";
echo $output['arr2'][0] . "<br>";
echo $output['arr2'][1] . "<br>";
?> 
value
foo bar
baz
Java
PHP JavaScript

似たような機能の parse_url() 関数もあります。

数値の操作

PHP には数値を扱う関数が多数あります。以下は、よく使われる関数です。

最大値・最小値の取得

単体(スカラー値)の数値や、配列に含まれる数値の最大値を取り出すのが、max() 関数で、最小値を取り出すのが min() 関数です。以下が構文です。

//配列の場合
mixed max ( array $values )

//単体の数値の場合
mixed max ( mixed $value1 , mixed $value2 [, mixed $... ] )  

パラメータとして配列をひとつだけ渡した場合は、max() は配列の中で最も大きい数値を返します。 ふたつ以上のパラメータを指定した場合は、max() はそれらの中で最も大きいものを返します。

//配列の場合
mixed min ( array $values )

//単体の数値の場合
mixed min ( mixed $value1 , mixed $value2 [, mixed $... ] )

パラメータとして配列をひとつだけ渡した場合は、 min() は配列の中で最も小さい数値を返します。 ふたつ以上のパラメータを指定した場合は、min() はそれらの中で最も小さいものを返します。

パラメータ

  • values:値を含む配列。
  • value1:任意の比較可能な値。
  • value2:任意の比較句可能な値。
  • ...:任意の比較句可能な値。

以下は簡単なサンプルです。

<?php
$x = 66;
$y = 23;
$z = 189;
echo "最大値(max):". max($x, $y, $z). "<br>";
echo "最小値(min):". min($x, $y, $z);
?> 
最大値(max):189
最小値(min):23
<?php
$array = array(99, 76, 321, 5);
echo "最大値(max):". max($array). "<br>";
echo "最小値(min):". min($array);
?>
最大値(max):321
最小値(min):5

小数点の操作

小数点を丸めるのに使用する関数は以下になります。

切り上げ ceil()

float ceil ( $value )

value の次に大きい整数値を返します。

<?php
echo ceil(4.3). "<br>";    // 5
echo ceil(9.999). "<br>";  // 10
echo ceil(-3.14). "<br>";  // -3
?>
5
10
-3

小数点以下第1位等で、切り上げしたい場合

ceil() や floor() は常に整数値が戻るため、小数点以下第1位や第2位等で、切り上げ(切捨て)したい場合以下のような計算をして取得することができます。

<?php
$value = 12.345;
echo ceil($value * 10) / 10 . "<br>";
echo ceil($value * 100) / 100 . "<br>";
?>
12.4
12.35

切捨て floor()

mixed floor ( $value )

必要に応じて value を丸めることにより、 value をこえない最大の整数の値を (float 型で) 返します。

<?php
echo floor(4.3). "<br>";   // 4
echo floor(9.999). "<br>"; // 9
echo floor(-3.14). "<br>"; // -4
?>
4
9
-4

四捨五入 round()

float round ( $val [,$precision [, $mode]] )
  • val:丸める値。
  • precision:オプションで指定する、丸める桁数。負の値も指定可能。(デフォルトは 0)
  • mode:次の定数のいずれかを使って、丸めのモードを指定します。(デフォルトは PHP_ROUND_HALF_UP)
    • PHP_ROUND_HALF_UP :val が小数点第 precision 位の値になるように、 ゼロから離れる方向に丸めます。1.5 は 2 に、そして -1.5 は -2 になります。
    • PHP_ROUND_HALF_DOWN :val が小数点第 precision 位の値になるように、 ゼロに近づく方向に丸めます。1.5 は 1 に、そして -1.5 は -1 になります。
    • PHP_ROUND_HALF_EVEN :val が小数点第 precision 位の値になるように、 次の偶数に丸めます。
    • PHP_ROUND_HALF_ODD :val が小数点第 precision 位の値になるように、 次の奇数に丸めます。
<?php
echo round(3.4). "<br>";         // 3
echo round(3.5). "<br>";         // 4
echo round(3.6). "<br>";         // 4
echo round(3.6, 0). "<br>";      // 4
echo round(1.95583, 2). "<br>";  // 1.96
echo round(1241757, -3). "<br>"; // 1242000
echo round(5.045, 2). "<br>";    // 5.05
echo round(5.055, 2). "<br>";    // 5.06
?>
3
4
4
4
1.96
1242000
5.05
5.06

乱数の発生

乱数を発生させるるには、rand() 関数を使用します。以下が構文です。

int rand ( $min , $max )

パラメータ

  • min:返す値の最小値 (デフォルトは 0)。
  • max:返す値の最大値 (デフォルトは getrandmax())。

戻り値

min (あるいは 0) から max (あるいは getrandmax()、それぞれ端点を含む) までの間の疑似乱数値を返します。

オプションの引数 min,max を省略してコールした場合、rand() は 0 と getrandmax() の間の擬似乱数(整数)を返します。 例えば、5 から 15 まで(両端を含む)の乱数を得たい場合、 rand(5, 15) とします。

(Windows のような)いくつかのプラットフォームでは、getrandmax() は 32767 と小さな値となっています。 32767 より広い範囲にしたい場合、 min および max を指定することで、 これより大きな範囲の乱数を生成することができます。 もしくは、 mt_rand() をかわりに使用してみてください。

echo  "getrandmax() の返す値:". getrandmax();
getrandmax() の返す値:2147483647

以下は乱数を発生させるサンプルです。

<?php
echo rand() . "<br>";
echo rand() . "<br>";

echo rand(5, 15) . "<br>";
echo rand(5, 15) . "<br>";
?>
1971337467
2138867222
13
13

重複しない乱数を生成

rand() を使って乱数を生成すると殆どの場合、値が重複します。

以下は、range()を使って数値の配列を生成して、shuffle() を使って要素の順番をランダムにする例です。

<?php
$my_random = range( 1, 9);
shuffle($my_random);
foreach($my_random as $rand){
  echo $rand;
}
?>
867452913

数値形式をフォーマット

桁区切りや小数点など、数値をフォーマットするには number_format() 関数を使用します。以下が構文です。

string number_format ( $number, $decimals, $dec_point, $thousands_sep )

パラメータ

  • number:フォーマットする数値。
  • decimals:小数点以下の桁数。デフォルトは 0。
  • dec_point: 小数点を表す区切り文字。デフォルトはドット (".") 。
  • thousands_sep:千位毎の区切り文字。デフォルトはカンマ (",")。

戻り値

number をフォーマットした結果を返します。

この関数は 1 つか 2 つもしくは 4 つのパラメータを受け取ります (3 つはありません) 。

  • パラメータが 1 つだけ渡された場合:数値は千位毎にカンマ (",") が追加され、 整数に四捨五入され(小数なし)でフォーマットされます。

  • パラメータが 2 つ渡された場合:数値は指定された小数点位置に四捨五入され 、 千位毎にカンマ (",") が追加されてフォーマットされます。

  • パラメータが 4 つ全て渡された場合:数値は指定された小数点位置に四捨五入され 、小数点の代わりに dec_point が、千位毎にカンマ (",") の代わりに thousands_sep が追加されてフォーマットされます。

<?php
$number = 123456789.987654321;
echo number_format($number). "<br>";
echo number_format($number, 3). "<br>";
// フランスの表記
echo number_format($number, 2, ',', ' '). "<br>";
// 千位毎の区切りがない英語での表記
echo number_format($number, 4, '.', ''). "<br>";
?>    
123,456,790
123,456,789.988
123 456 789,99
123456789.9877

整数としての値を取得

intval() 関数は引数に指定した値を整数値(integer)に変換します。基数を指定することもできます(n進数を10進数へ変換)。

以下が構文です。

int intval( $var [, $base ] )

パラメータ

  • var(mixed):整数に変換するスカラー値
  • base(int):変換のための基数。デフォルトは 10。

注意:
base が 0 の場合は、 var のフォーマットに基づいて利用する基数を決めます。

  • 文字列の先頭が "0x" (あるいは "0X") の場合は、基数を 16 (十六進数) とします。
  • そうではなく、文字列の先頭が "0" の場合は、基数を 8 (八進数) とします。
  • それ以外の場合は、基数を 10 (十進数) とします。

戻り値

成功時は var の変換後の整数値(10進数の値)を返します。失敗時は 0。 空の配列の場合は 0、空でない配列の場合は 1 を返します。

最大値はシステムに依存します。オブジェクトに intval() を使用することはできません。 その場合は E_NOTICE レベルのエラーを発して 1 を返します。

以下は、サンプルです。

注意:
第2パラメータの基数(base)を指定する場合、対象の値(var)が文字列でない限り意味がありません。

<?php
echo intval(37) ;   // 37
echo intval(3.7) ;   // 3
echo intval(037) ;   // 31(8進数の37を整数に変換)
echo intval('037') ;  // 37
echo intval(1e10) ;  // 1410065408
echo intval('1e10') ;  // 1
echo intval(0x1A) ;   // 26
echo intval(37, 8) ;   // 37(基数を指定しても意味がない例)
echo intval('37', 8) ;  // 31(8進数の37を整数に変換)
echo intval('11111111', 2) ;   // 255(2進数の11111111を整数に変換)
echo intval('37', 16) ;  // 55 (16進数の37を整数に変換)
?> 
37
3
31
37
10000000000
10000000000
26
37
31
255
55

n 進数への変換

10進数から2進数、8進数、16進数への変換や、その逆の変換を行う関数がいくつか用意されています。

base_convert()

base_convert() 関数は数値の基数を任意に変換する関数です。以下が構文です。

string base_convert( $number , $frombase , $tobase )

変換する値(number)を基数(tobase)で表した文字列を返します。 変換する値(number)の基数は、 frombase で指定します。 frombase および tobase は、ともに 2 から 36 までである必要があります。

警告
大きな数値で base_convert() を使用すると、 精度が失われてしまうことがあります。

パラメータ

  • number(string):変換する数値(文字列型)。
  • frombase(int):返還前の number の基数。
  • tobase(int):変換後の number の基数。

戻り値

指定した値(number)を基数 tobase で表した値に変換して返します。

以下はサンプルです。

<?php
echo base_convert('255', 10, 2);  //10進数を2進数に変換
echo base_convert('100110', 2, 10);  //2進数を10進数に変換
echo base_convert('A37334', 16, 2);  //16進数を2進数に変換
echo base_convert('0022', 8, 10);  //8進数を10進数に変換
?>
11111111
38
101000110111001100110100
18

10進数から n 進数への変換 decXXX()

10進数(decimal)から n 進数への変換を行う関数には以下のようなものがあります。

値は10 進数値(数値型)で指定し、戻り値は文字列型になります。

10進数から n 進数への変換を行う関数
変換 関数
10進数から 2 進数(binary) decbin() echo decbin(26);   //11010
10進数から 8 進数(octal) decoct() echo decoct(264);   //410
10進数から 16 進数(hexadecimal) dechex() echo dechex(47);   //2f

n 進数から10進数への変換 XXXdec()

n 進数から10進数(decimal)への変換を行う関数には以下のようなものがあります。

値は文字列型で指定し、戻り値は数値型になります。

n 進数から10進数への変換を行う関数
変換 関数
2 進数(binary)から10進数 bindec() echo bindec('110011')   //51
8 進数(octal)から10進数 octdec() echo octdec('77')   //63
16 進数(hexadecimal)から10進数 hexdec() echo hexdec("a0");   //160

10進数以外の変換の場合、10進数変換が用意されているので、10進数経由で変換することができます。

<?php
echo decoct(bindec('110011')); // 2進数->8進数
echo dechex(bindec('110011')); // 2進数->16進数
echo decbin(octdec('77')); // 8進数->2進数
echo dechex(octdec('77')); // 8進数->16進数
echo decbin(hexdec("a0")); // 16進数->2進数
echo decoct(hexdec("a0")); // 16進数->8進数
?>
63
33
111111
3f
10100000
240

配列の操作

以下は配列の操作でよく使われる関数です。配列の基本的なことは「配列」を参照ください。

要素数の取得

配列に含まれる要素の数を取得するには count() 関数を使用します。以下が構文です。

int count ( $array_or_countable [, $mode ] )

パラメータ

  • array_or_countable:配列あるいは Countable オブジェクト。
  • mode:オプションのmode 引数が COUNT_RECURSIVE (または 1) にセットされた場合、count() は再帰的に配列をカウントします。 これは多次元配列の全ての要素をカウントするといった場合に特に有効です。

戻り値

array_or_countable に含まれる要素の数を返します。 もしパラメータが配列もしくは Countable インターフェイスを実装したオブジェクトではない場合、 1 が返されます。 また例外があり、array_or_countable が NULL の場合、 0 が返されます。

<?php
$a = array(1, 5, 23, 78);
echo count($a). "<br>"; // output 4

$b[0]  = 7;
$b[5]  = 9;
$b[10] = 11;
echo count($b). "<br>"; // output 3

$food = array('fruits' => array('orange', 'banana', 'apple'),
              'veggie' => array('carrot', 'collard', 'pea'));

// 再帰的なカウント
echo count($food, COUNT_RECURSIVE). "<br>"; // output 8

// 通常のカウント
echo count($food). "<br>"; // output 2
?>
4
3
8
2

※バージョン 7.2.0 から第一引数に配列、またはカウントすることができるオブジェクト以外(不正な Countable 型)を渡すと「Warning: count(): Parameter must be an array or an object that implements Countable in ...」のようなエラー(警告)が出るようになっています。

そのため count() を使う場合、渡す値が配列やカウントできるオブジェクトでない可能性がある場合は、is_array() を使って判定すると良いようです。

<?php
//値が配列であれば
if ( is_array( $foo ) ) {

  //要素の数が2以上の場合
  if ( count( $foo ) > 1 ) {
     ・・・
  }
}
?>

要素の追加

配列に要素を追加するには、array_unshift() 関数array_push() 関数が使えます。

array_unshift() 配列の先頭に要素を追加

int array_unshift ( &$array , $value1 [, $... ] )

パラメータ

  • array:入力の配列。
  • value1, ...:配列の先頭に加える値。

戻り値

処理後の配列(array)の要素の数を返します。

<pre>
<?php
$queue = array("orange", "banana");
$result = array_unshift($queue, "apple", "raspberry");
print_r($queue);
echo "<br>戻り値: " . $result;
?>
</pre>
Array
(
    [0] => apple
    [1] => raspberry
    [2] => orange
    [3] => banana
)

戻り値: 4

array_push() 配列の最後に要素を追加

int array_push ( &$array , $value1 [, $... ] )

array_unshift() は、array の先頭に指定された要素を加えます。リストの要素は全体として加えられるため、 加えられた要素の順番は変わらないことに注意してください。 配列の数値添字はすべて新たにゼロから振りなおされます。

パラメータ

  • array:入力の配列。
  • value1, ...:配列の最後に追加する値。

戻り値

処理後の配列の中の要素の数を返します。

<pre>
<?php
$stack = array("orange", "banana");
$result = array_push($stack, "apple", "raspberry");
print_r($stack);
echo "<br>戻り値: " . $result;
?>
</pre>
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)

戻り値: 4

ブラケット [ ] に添え字を指定せずに代入

配列のブラケット [ ] に添え字を指定せずに代入を行うと、必ず配列の末尾に要素が追加されます。もし、配列に複数の要素を追加しない場合は、ブラケット [ ] に添え字を指定せずに代入を行う方が array_push() を使うより早く処理されます。

<pre>
<?php
$stack = array("orange", "banana");
$stack[] = "apple";
$stack[] = "raspberry";
print_r($stack);
?>
</pre> 
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)

要素の削除(比較・置換)

変数の割当を解除(削除)する関数 unset() を使うと配列の要素や配列自体を削除することができます。

複数の要素を削除する場合は、カンマ区切りで記述します

以下は配列の要素や配列自体を削除する例です。配列の添え字やキーを指定しない場合は、配列自体が削除されます。

<?php
$array = ["JavaScript", "C++", "PHP", "Perl", "Java"];
echo "元の配列の要素を表示 <br>";
var_dump( $array );

unset($array[1]);
echo '<br>unset($array[1]); //2番目の要素を削除<br>';
var_dump( $array );
echo "<br>";

unset($array[0],$array[3]);
echo '<br>unset($array[0],$array[3]); //1番目と4番目の要素を削除<br>';
var_dump( $array );
echo "<br>";

unset($array);  //配列自体を削除
var_dump( $array );
?> 
元の配列の要素を表示 
array(5) { [0]=> string(10) "JavaScript" [1]=> string(3) "C++" [2]=> string(3) "PHP" [3]=> string(4) "Perl" [4]=> string(4) "Java" }
unset($array[1]); //2番目の要素を削除

array(4) { [0]=> string(10) "JavaScript" [2]=> string(3) "PHP" [3]=> string(4) "Perl" [4]=> string(4) "Java" }

unset($array[0],$array[3]); //1番目と4番目の要素を削除

array(2) { [2]=> string(3) "PHP" [4]=> string(4) "Java" }
//配列自体を削除したので変数が未定義であるというエラーが表示されます。 Notice: Undefined variable: array in C:\xampp\htdocs\webdesignleaves\pr\php\php_basic_01.php on line 1218 NULL

※上記の結果からわかるように配列の要素を削除した場合、配列の要素番号は変更されません。要素番号を詰めたり、0から振りなおす必要がある場合は、array_values() 関数を使用します。

連想配列の要素を削除する場合は、キーを指定します。

<?php
$array = array('php' => 'PHP: Hypertext Preprocessor',
              'html' => 'Hyper Text  Markup Language',
              'ajax' => 'Asynchronous  JavaScript And XML',
              'css' => 'Cascading Style Sheet');

unset($array['ajax']);  //キーが'ajax'の要素を削除
var_dump( $array );
?>
array(3) {
  ["php"]=>
  string(27) "PHP: Hypertext Preprocessor"
  ["html"]=>
  string(27) "Hyper Text  Markup Language"
  ["css"]=>
  string(21) "Cascading Style Sheet"
}
  

また、以下の関数を利用することで、配列の要素を削除することができます。

関数 概要
array_shift() 配列の先頭から要素を一つ取り出して返す(先頭の要素を削除)
array_pop() 配列の末尾から要素を取り出して返す(末尾の要素を削除)
array_splice() 配列の一部を削除し、他の要素で置換
array_diff() 配列の要素を比較して、同じ値を持っている要素を削除
array_intersect() 配列の要素を比較して、同じ値を持っている要素を返す(異なる値の要素を削除)

array_shift() 配列の先頭から要素を一つ取り出す

array_shift() は、array の最初の値を取り出して返します。配列 array は、要素一つ分だけ短くなり、全ての要素は前にずれます(先頭の値が削除されます)。

数値添字の配列のキーはゼロから順に新たに振りなおされますが、 リテラル(連想配列)のキーはそのままになります。

mixed array_shift ( &$array )

パラメータ

  • array:対象の配列(値を取り出す配列)。

戻り値

取り出した値を返します。array が空の場合や配列でない場合は NULL を返します。

<pre>
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack) . "<br>";
echo "<br>取り出した値: " . $fruit;
?>
</pre>
Array
(
    [0] => banana
    [1] => apple
    [2] => raspberry
)

取り出した値: orange

array_pop() 配列の末尾から要素を取り除く

array_pop() は配列 array の最後の値を取り出して返します。 配列 array は、要素一つ分短くなります(最後の値が削除されます)。

mixed array_pop ( &$array )

パラメータ

  • array:対象の配列(値を取り出す配列)。

戻り値

配列 array の最後の値を取り出して返します。 array が空 (または、配列でない) の場合、 NULL が返されます。

<pre>
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack) . "<br>";
echo "<br>取り出した値: " . $fruit;
?>
</pre>
Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)

取り出した値: raspberry

array_splice() 配列の一部を削除し、他の要素で置換

array_splice() は配列の一部を削除し、他の要素で置換します。置換する要素を指定しない場合は、削除のみ実行されます。

array array_splice ( &$input , $offset [, $length [, $replacement ]] )

パラメータ

  • input:対象の配列
  • offset:削除される部分は、正の値の場合、配列 input の先頭からの位置からとなり、 offset が負の場合、input の末尾から数えた位置からとなります。offset は0から始まり、例えば1を指定した場合、2つ目が開始位置となります。
  • length:length が省略された場合、 offset から配列の最後までが全て削除されます。
    length が指定され、正の場合、指定した個数の要素が削除されます。
    負の length が指定された場合、削除される部分の末尾の位置は配列の末尾を基準にして計算されます。
    length にゼロを指定した場合は、どの要素も削除しません。
  • replacement:配列 replacement が指定された場合、削除された要素は、この配列の要素で置換されます。 もし replacement に一つしか要素がない場合、array() で括る必要はありません。
    offset および length で何も削除しないと指定した場合、配列 replacement の要素は offset で指定された位置に挿入されます。 置換される配列のキーは保存されないので注意が必要です。

戻り値

抽出された要素を含む配列を返します。元の配列は抽出された要素が切り取られ、変更されます。

以下のサンプルでは、わかり易いように以下のような0~9の連続した数値の値の配列を使用します。(関連項目:range()

<?php
$data = range(0,9);
print_r($data);
?>
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 9
)

対象の配列と offset のみを指定した場合の例です。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, 2);  //offset 2 なので3番目から切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo '$data(実行後の元元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>

最初(0)から offset の分「2」だけ進んだ位置(3番目 $data[2])をスタート地点とします。length の指定が無い場合は最後まで切り取られます。

$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 7 [6] => 8 [7] => 9 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 )

前の例と offset は同じ「2」で length に「4」を指定した場合の例です。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, 2, 4);  //3番目から4つ切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 6 [3] => 7 [4] => 8 [5] => 9 )

以下は offset に「-2」を指定した例です。offset が負の場合、末尾から数えた位置からとなるので最後の2つが切り取られます。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, -2);  //最後の2つが切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 8 [1] => 9 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 )

以下は offset に「-5」を指定し、length に「3」を指定した例です。最後から5番目から3つ切り取られます。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, -5, 3);  //最後から5番目から3つ切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 5 [1] => 6 [2] => 7 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 8 [6] => 9 )

以下は length に負の値「-5」を指定した例です。開始位置は3番目から、最後の5個を残して切り取られます。length に負の値を指定した場合は、配列の最後の length(の絶対値)分を残して切り取られます。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, 2, -5);  //3番目から最後の5個を残して切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 2 [1] => 3 [2] => 4 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 5 [3] => 6 [4] => 7 [5] => 8 [6] => 9 )

以下は offset 及び lenght に負の値を指定した例です。offset が -5 なので、最後の5番目から、最後の3個(length が -3)を残して切り取られます。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, -5, -3);  //最後から5番目から最後の3個を残して切り取られます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 5 [1] => 6 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 7 [6] => 8 [7] => 9 )

以下は offset に 2、lenght に 4、replacement に "a" を指定した例です。3番目から4つの要素が切り取られ、その部分(offset で指定した位置)に "a" が挿入されます。

<?php
$data = range(0,9);  //0から9までを含む配列を生成
$spliced = array_splice($data, 2, 4, "a");  //3番目から4つの要素が切り取られ、その位置に "a" が挿入されます

echo '$spliced(戻り値の配列→切り取られた要素)'."<br>";
print_r($spliced);  //戻り値の配列
echo "<br>".'$data(実行後の元の配列)'."<br>";
print_r($data);  //変更された元の配列
?>
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => a [3] => 6 [4] => 7 [5] => 8 [6] => 9 )

以下は offset に -5、lenght に 2、replacement に配列 $replace を指定した例です。最後から5番目から2つの要素が切り取られ、その部分に配列 $replace が挿入されます。


      
$spliced(戻り値の配列→切り取られた要素)
Array ( [0] => 5 [1] => 6 )
$data(実行後の元の配列)
Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => X [6] => Y [7] => Z [8] => 7 [9] => 8 [10] => 9 )

array_diff()

array_diff() は、配列を比較して同じ値があればそれらを削除した要素を返します(差分を取得します)。

array array_diff ( $array1 , $array2 [, $... ] )

パラメータ

  • array1:比較元の配列
  • array2:比較対象の配列
  • ...:さらに比較したい配列

戻り値

array1 の要素のうち、他のどの配列にも含まれない要素のみを含む配列を返します。キーの比較はしません。元の配列は変更されません。

言い換えると、array1 の要素の中から array2 に含まれる要素(同じ値の要素があれば)を削除した配列を返します。比較する要素は、その文字列の表現が同じ場合に等しいと見なされます。

以下は $array1 を $array2 と比較して、同じ値があれば削除した結果の配列を返す例です。値が「green」の配列の要素のキーは異なりますが、値が同じなので削除されます。また、元の配列に同じ値が複数存在する場合、該当すればそれらも全て削除されます(この例の場合、red の値の要素)。

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

echo '$result'."<br>";
print_r($result);

echo '$array1'."<br>";
print_r($array1);  //元の配列は変更されません

echo '$array2'."<br>";
print_r($array2);  //元の配列は変更されません
?>
$result
Array ( [1] => blue )
$array1
Array ( [a] => green [0] => red [1] => blue [2] => red )
$array2
Array ( [b] => green [0] => yellow [1] => red )

以下は値が1から20までの配列から、値が6から10までの要素を削除する例です。また、その結果を array_values() を使って要素番号を振り直しています。

<?php
$array1 = range(1,20);
$array2 = range(6,10);
$result = array_diff($array1, $array2);

echo '$result'."<br>";
print_r($result);

$ordered_result = array_values($result);
echo "<br>".'ordered_result'."<br>";
print_r($ordered_result);
?>
$result
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [10] => 11 [11] => 12 [12] => 13 [13] => 14 [14] => 15 [15] => 16 [16] => 17 [17] => 18 [18] => 19 [19] => 20 )
ordered_result
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 11 [6] => 12 [7] => 13 [8] => 14 [9] => 15 [10] => 16 [11] => 17 [12] => 18 [13] => 19 [14] => 20 )

関連する関数:array_diff_assoc()

array_intersect()

array_intersect() は配列を比較して共通の値(同じ値)の要素を返します。言い換えると、共通しない値(異なる値)を削除した配列を返します。

array array_intersect ( $array1 , $array2 [, ... ] )

パラメータ

  • array1:比較元の配列
  • array2:比較対象の配列
  • ...:さらに比較したい配列

戻り値

array1 の値のうち、 すべての引数に存在する値のものを含む連想配列を返します。キーの比較はしません。また、元の配列は変更されません。

以下の例では、共通の値の要素("green"、"red"、"silver")を含む配列が返されます。返される配列の要素のキーは array1 のキーの値になっています。

<?php
$array1 = array("a" => "green", "red", "blue", "orange", "silver");
$array2 = array("b" => "green", "yellow", "red", "silver");
$result = array_intersect($array1, $array2);

echo '$result'."<br>";
print_r($result);

echo "<br>".'$array1'."<br>";
print_r($array1);

echo "<br>".'$array2'."<br>";
print_r($array2);
?>
$result
Array ( [a] => green [0] => red [3] => silver )
$array1
Array ( [a] => green [0] => red [1] => blue [2] => orange [3] => silver )
$array2
Array ( [b] => green [0] => yellow [1] => red [2] => silver )

関連する関数:array_intersect_key()

配列の並び替え

配列の要素の値や連想配列の要素のキーを昇順や降順に並べ替えることができます。PHP には以下のようなソート(並び替え)の関数があります。

ソートの種類
関数 内容
sort() 添え字配列の値を昇順にソート(ソート後、添え字は新しく割り当てられる)
rsort() 添え字配列の値を降順にソート(ソート後、添え字は新しく割り当てられる)
ksort() 連想配列のキーを昇順にソート(ソート後、キーと値の関係は維持)
krsort() 連想配列のキーを降順にソート(ソート後、キーと値の関係は維持)
asort() 連想配列の値を昇順にソート(ソート後、キーと値の関係は維持)
arsort() 連想配列の値を降順にソート(ソート後、キーと値の関係は維持)

構文は以下のようになっています。

論理値 = ソート関数名( 配列 [, ソート方法]);

オプションのパラメータ「ソート方法」は以下のような方法があります。

ソート方法
オプション定数 内容
SORT_REGULAR 通常通りに項目を比較 (型は変更しません)(デフォルト)
SORT_NUMERIC 数値的に項目を比較
SORT_STRING 文字列として項目を比較
SORT_LOCALE_STRING 現在のロケールに基づいて比較
SORT_NATURAL 要素の比較を文字列として行い「自然順」で比較
SORT_FLAG_CASE SORT_STRING や SORT_NATURAL と(| で)組み合わせて使い、 文字列のソートで大文字小文字を区別しない

ロケール:国や地域によって異なる言語や記号、単位、日付、通貨などの表記方法

以下は sort() と rsort() の例です。

<?php
echo "sort() 昇順<br>";
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "<br>";
}

echo "<br>rsort() 降順<br>";
rsort($fruits);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "<br>";
}
?>
sort() 昇順
fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

rsort() 降順
fruits[0] = orange
fruits[1] = lemon
fruits[2] = banana
fruits[3] = apple

数字を文字列(SORT_STRING)としてのソートする場合の例

<?php
$num = array("9", "123", "1", "25");
sort($num);
echo "sort(\$num)<br>";
foreach ($num as $key => $val) {
    echo "num[" . $key . "] = " . $val . "<br>";
}
sort($num, SORT_STRING);
echo "<br>sort(\$num, SORT_STRING)<br>";
foreach ($num as $key => $val) {
    echo "num[" . $key . "] = " . $val . "<br>";
}
?>

通常のソートと並び替えの順番が異なることに注意してください。

sort($num)
num[0] = 1
num[1] = 9
num[2] = 25
num[3] = 123

sort($num, SORT_STRING)
num[0] = 1
num[1] = 123
num[2] = 25
num[3] = 9

sort() で、大文字小文字を区別せず(SORT_FLAG_CASE)に自然順(SORT_NATURAL)で並べ替えを行う例

<?php
$fruits = array("Orange1", "orange20", "Orange3", "orange2");

sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "<br>";
}
?>
fruits[0] = Orange1
fruits[1] = orange2
fruits[2] = Orange3
fruits[3] = orange20

連想配列の場合

連想配列を sort()/rsort() でソートすると、キーが添え字にリセットされてしまいます。

<?php
$data = array("a" => 200, "b" => 33, "c" => 78);
sort($data);
foreach ($data as $key => $val) {
    echo "data[" . $key . "] = " . $val . "<br>";
}
?>
data[0] = 33
data[1] = 78
data[2] = 200

連想配列用のソート関数の例 asort()/arsort()

<?php
echo "asort(\$data) : 連想配列の値を昇順にソート<br>";
$data = array("a" => 200, "b" => 33, "c" => 78);
asort($data);
foreach ($data as $key => $val) {
    echo "data[" . $key . "] = " . $val . "<br>";
}
echo "<br>arsort(\$data) : 連想配列の値を降順にソート<br>";
$data = array("a" => 200, "b" => 33, "c" => 78);
arsort($data);
foreach ($data as $key => $val) {
    echo "data[" . $key . "] = " . $val . "<br>";
}
?>
asort($data) : 連想配列の値を昇順にソート
data[b] = 33
data[c] = 78
data[a] = 200

arsort($data) : 連想配列の値を降順にソート
data[a] = 200
data[c] = 78
data[b] = 33

連想配列用のソート関数の例 ksort()/krsort()

<?php
echo "ksort(\$data) : 連想配列のキーを昇順にソート<br>";
$data = array("b" => 33, "c" => 78, "a" => 200);
ksort($data);
foreach ($data as $key => $val) {
    echo "data[" . $key . "] = " . $val . "<br>";
}
echo "<br>krsort(\$data) : 連想配列のキーを降順にソート<br>";
krsort($data);
foreach ($data as $key => $val) {
    echo "data[" . $key . "] = " . $val . "<br>";
}
?>
ksort($data) : 連想配列のキーを昇順にソート
data[a] = 200
data[b] = 33
data[c] = 78

krsort($data) : 連想配列のキーを降順にソート
data[c] = 78
data[b] = 33
data[a] = 200

要素を逆順に

array_reverse() は要素を逆順にした配列を返します。

array_reverse ( $array [, $preserve_keys ] )

パラメータ

  • array :対象の配列
  • preserve_keys :true の場合は数値のキーを保持します(デフォルト false)。 非数値のキーは、この設定にかかわらず常に保持されます。

戻り値

順序を逆転させた配列を返します。

数値キーの場合。

<?php
$input  = array("PHP", "JavaScript", "HTML", "CSS");
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($input);
print_r($reversed);
print_r($preserved);
?>
$input
Array ( [0] => PHP [1] => JavaScript [2] => HTML [3] => CSS )
$reversed
Array ( [0] => CSS [1] => HTML [2] => JavaScript [3] => PHP )
$preserved(preserve_keys :true 数値のキーを保持)
Array ( [3] => CSS [2] => HTML [1] => JavaScript [0] => PHP )

非数値キー(連想配列)の場合は、第2パラメータを指定してもしなくても同じ結果になります。

<?php
$input  = array('php'=>"PHP", 'js'=>"JavaScript", 'html'=>"HTML", 'css'=>"CSS");
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($input);
print_r($reversed);
print_r($preserved);
?>   
$input
Array ( [php] => PHP [js] => JavaScript [html] => HTML [css] => CSS )
$reversed
Array ( [css] => CSS [html] => HTML [js] => JavaScript [php] => PHP )
$preserved
Array ( [css] => CSS [html] => HTML [js] => JavaScript [php] => PHP )

配列を変数に1度に代入

list() 関数を使うと、配列の要素を1度に変数に代入することができます。以下が構文です。

array list ( $var1 [, $... ] )

list() は、 単一の操作で一連の変数に値を代入するために使われます。配列と同様の形式で、複数の変数への代入を行います。(この関数は実際には関数ではなく言語構造です。)

パラメータ

  • var1 :変数

戻り値

代入した配列を返します。

以下は list() 関数を使った例です。

<?php
$info = array('コーヒー', '茶色', 'カフェイン');

// すべての変数の取得
list($drink, $color, $power) = $info;
echo "$drink の色は $color で、$power が含まれています。<br>";

// 一部の変数の取得
list($drink, , $power) = $info;
echo "$drink には $power が含まれています。<br>";

// 三番目のみの取得
list( , , $power) = $info;
echo "$power 欲しい!<br>";
?>
コーヒー の色は 茶色 で、カフェイン が含まれています。
コーヒー には カフェイン が含まれています。
カフェイン 欲しい!

連想配列の場合

list() 関数は、連想配列ではそのままでは使えません。

連想配列を使う場合は、array_values() 関数を使って連想配列の値を取得して利用します。

<?php
$info = array('a' => 'コーヒー', 'b' => '茶色', 'c' => 'カフェイン');
list($drink, $color, $power) = array_values($info);
echo "$drink の色は $color で、$power が含まれています。<br>";
?>
コーヒー の色は 茶色 で、カフェイン が含まれています。

連想配列のキーを取得したい場合は、array_keys()関数を使って連想配列のキーを取得して利用します。

<?php
$info = array('a' => 'コーヒー', 'b' => '茶色', 'c' => 'カフェイン');
list($drink, $color, $power) = array_keys($info);
echo "$drink の色は $color で、$power が含まれています。<br>";
?>
a の色は b で、c が含まれています。

配列のキーの取得

配列のキーすべて、あるいはその一部を取得するには、array_keys() を使います。以下が構文です。

array array_keys ( $array [, $search_value [, $strict ]] )

array_keys() は、配列 array から全てのキー (数値および文字列) を返します。オプション search_value が指定された場合、 指定した値に関するキーのみが返されます。指定されない場合は、 array から全てのキーが返されます。

パラメータ

  • array:返すキーを含む配列。
  • search_value:指定した場合は、これらの値を含むキーのみを返します。
  • strict:検索時に厳密な比較 (===) を行うかどうか。

戻り値

array の(すべての)キーを配列で返します。

以下はサンプルです。

<pre>
<?php
$array = array(0 => 100, "color" => "red");
print_r(array_keys($array));
echo "<br>";
$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));
?>
</pre>
Array
(
    [0] => 0
    [1] => color
)

Array ( [0] => 0 [1] => 3 [2] => 4 )

配列の一部を取得

配列で指定位置から要素を取得するには、array_slice() 関数を使用します。以下が構文です。

array array_slice ( $array , $offset [, $length [, $preserve_keys ]] )

パラメータ

  • array:対象の配列。
  • offset:取り出しの開始位置。offset が負の値ではない場合、要素位置の計算は、 配列 array の offset から始められます。 offset が負の場合、要素位置の計算は array の最後から行われます。
  • length:取り出す個数。lengthが指定され、正の場合、 配列の要素の中から最大でその数までの要素を返します。 配列の要素数が length より少ない場合は、 配列から取得できる要素だけを返します。length が指定され、負の場合、配列の末尾から連続する複数の要素が返されます。 省略された場合、offset から配列の最後までの全ての要素が返されます。
  • preserve_keys:添え字をリセットするかどうか。 array_slice() はデフォルトで配列の数値キーを並べなおし、 リセットすることに注意してください。 preserve_keys を TRUE にする事で添え字をそのままで配列を取り出します。

戻り値

取り出し後の配列を返します。

※ 取り出し元の配列は、そのままの要素を保持するので変化はありません。

以下は添え字を使った配列のサンプルです。

<pre>
<?php
$input = array("a", "b", "c", "d", "e");

//先頭から3番目の要素から最後の要素まで
$output = array_slice($input, 2);
print_r($output);  // "c", "d", "e" を返す
echo "<br>";

//先頭から3番目の要素から1個
$output = array_slice($input, 2, 1);
print_r($output);  // "c" を返す
echo "<br>";

//先頭から3番目の要素から1個(添え字リセットなし)
$output = array_slice($input, 2, 1, TRUE);
print_r($output);    // "c" を返す (添え字はそのまま)
echo "<br>";

//最後から4番目の要素から最後まで
$output = array_slice($input, -4);
print_r($output);  // "b", "c", "d", "e" を返す
echo "<br>";

//最後から4番目の要素から2個(添え字リセットなし)
$output = array_slice($input, -4, 2, TRUE);
print_r($output);  // "b", "c" を返す (添え字はそのまま)
echo "<br>";
?>
</pre>    
Array
(
    [0] => c
    [1] => d
    [2] => e
)

Array ( [0] => c )
Array ( [2] => c )
Array ( [0] => b [1] => c [2] => d [3] => e )
Array ( [1] => b [2] => c )

以下は連想配列のサンプルです。連想配列の場合は、キーはそのままです。

<pre>
<?php
$input = array("a" => "A", "b" => "B", "c" => "C", "d" => "D", "e" => "E");

//先頭から3番目の要素から最後の要素まで
$output = array_slice($input, 2);
print_r($output);  // "C", "D", "E" を返す
echo "<br>";

//先頭から3番目の要素から1個
$output = array_slice($input, 2, 1);
print_r($output);  // "C" を返す
echo "<br>";

//最後から4番目の要素から最後まで
$output = array_slice($input, -4);
print_r($output);  // "B", "C", "D", "E" を返す
echo "<br>";
?>
</pre>
Array
(
    [c] => C
    [d] => D
    [e] => E
)

Array ( [c] => C )
Array ( [b] => B [c] => C [d] => D [e] => E )

配列の全ての値を取得

array_values() 関数は、指定された配列から全ての値を取り出し、数値添字をつけた配列を返します。以下が構文です。

array array_values ( $array )

パラメータ

  • array:対象の配列。

戻り値

数値添字の値の配列を返します。

<pre>
<?php
$array = array("size" => "Small", "color" => "White", "price" => "$50");
$array2 = array_values($array);
print_r($array);
echo "<br>";
print_r($array2);
?>
</pre>
Array
(
    [size] => Small
    [color] => White
    [price] => $50
)

Array ( [0] => Small [1] => White [2] => $50 )

array_values() を使用すると要素番号を詰めることができます。

例えば、以下のように unset() を使って配列の要素を削除した場合、配列の要素番号は変更されませんが、array_values() を使用すると要素番号が振り直されるので、要素番号を詰めることができます。

<pre>
<?php
$array = array("JavaScript", "C++", "PHP", "Perl");
unset($array[1]);
print_r($array);
echo "<br>";
$array2 = array_values($array);
print_r($array2);
?>
</pre>
Array
(
    [0] => JavaScript
    [2] => PHP
    [3] => Perl
)

Array ( [0] => JavaScript [1] => PHP [2] => Perl )

配列の要素にコールバック関数を適用

array_map() 関数は、指定した配列の要素にコールバック関数を適用します。以下が構文です。

array_map( $callback , $array1 [, $... ] ) 

パラメータ

  • callback:配列の各要素に適用するコールバック関数
  • array1 :コールバック関数を適用する配列。

戻り値

各要素に コールバック関数(callback)を適用した結果の配列

以下は配列の各要素に値を2倍にするコールバック関数(double_the_value)を適用する例です。

<?php
function double_the_value($val) {
  return $val * 2;
}

$array1 = [1, 2, 3];
$array2 = array_map('double_the_value', $array1);

print_r($array2);
?>
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
)
    

コールバック関数(callback)が受け付けるパラメータの数は、 array_map() に渡される配列の数に一致している必要があります。

以下は2つの配列の対応する要素の和を返すコールバック関数を適用する例です。 array_map() に2つの配列を渡すので、コールバック関数(sum_two_arrays)は2つのパラメータを受け付けます。

<?php
function sum_two_arrays($val1, $val2) {
  return $val1 + $val2;
}

$array1 = [1, 2, 3];
$array2 = [3, 4, 5];
$array3 = array_map('sum_two_arrays', $array1, $array2);

print_r($array3);
?>
Array
(
    [0] => 4
    [1] => 6
    [2] => 8
)
    

コールバック関数の名前として NULL を使用すると配列の配列を生成することができます。

<?php
$array1 = [1, 2, 3];
$array2 = ['one', 'two', 'three'];
$array3 = ['いち', 'に', 'さん'];
$array4 = array_map(null, $array1, $array2, $array3);

print_r($array4);
?>
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => いち
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => に
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => さん
        )

)
    

HTML 文字列の操作

特殊文字を文字参照に変換

HTML では、& や < などの特別な意味を持つ文字は、&amp; や &lt; のような文字参照(HTMLエンティティ)と呼ばれる表記に変換して記述する必要があります。

PHP には、そのエスケープ処理を行う htmlspecialchars() と言う関数が用意されています。

また、セキュリティ上の理由(クロスサイトスクリプティング対策)からフォームなどから入力されたユーザーのデータをブラウザに表示する際は、原則すべてのデータを出力時に htmlspecialchars() 関数を使用してエスケープ(サニタイズ)処理します。

変換対象となる文字は以下の通りです。(オプションのフラグにより、対象文字が異なります)

  • & (アンパサンド) は &amp; になります。
  • " (ダブルクォート) は &quot;になります。
  • ' (シングルクオート) は &#039; (あるいは &apos;) になります。
  • < (小なり) は &lt; になります。
  • > (大なり) は &gt; になります。

入力文字列の中で名前付きエンティティ(文字参照)に関連づけられたものを すべて変換する必要がある場合には、代わりに htmlentities() を使用します。

以下が構文です。

string htmlspecialchars( $string [,$flags [,$encoding [,$double_encode ]]])

パラメータ

  • string(string):変換される文字列。
  • flags(int):以下のフラグを指定することができます。(フラグは他にもあります)
    • ENT_COMPAT(デフォルト):ダブルクオートは変換しますがシングルクオートは変換しません。
    • ENT_QUOTES(*必ずこれを指定):シングルクオートとダブルクオートを共に変換します。
    • ENT_NOQUOTES:シングルクオートとダブルクオートは共に変換されません。
  • encoding(string):文字を変換するときに使うエンコーディングを定義します。 オプションですが、適切な値を指定しておくことが強く推奨されています。省略した場のデフォルト値は PHP 5.6.0 以降では default_charset の値(UTF-8)を使います。
  • double_encode(bool):オフ(false)にすると、PHP は既存の html エンティティをエンコードしません。 デフォルト(オン/true)では、既存のエンティティも含めてすべてを変換します。

戻り値

変換後の文字列を返します。

以下はサンプルです。

<?php
$str = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES, 'UTF-8');
echo $str;
?>
<a href='test'>Test</a>

ブラウザでソースを確認すると、以下のようになっています。

&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;

この関数を頻繁に使用する場合は、以下のようにユーザー定義関数にしておくと便利です。

<?php
//h() 関数の定義
function h($str) {
  $html = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
  return $html;
}
//関数の実行
echo h("<a href='test'>Test</a>");
?>
<a href='test'>Test</a>

参考:PHP5.4のhtmlspecialcharsに非互換問題

HTML タグの削除

文字列から HTML および PHP タグを削除してくれるのが、strip_tags() 関数です。

以下が構文です。

string strip_tags ( $str [, $allowable_tags ] )

この関数は、指定した文字列 (str) から全ての NUL バイトと HTML および PHP タグを取り除きます。

また、第2パラメータ(allowable_tags)で、特定のタグを除外する指定が可能です。

但し、strip_tags() 関数では、 HTML タグの書き方などによっては予想外の文字列が削除されてしまう可能性があり、また第2パラメータ(allowable_tags)で許可した全てのタグの属性については修正しないなどの問題があるため、クロスサイトスクリプティング対策としては、htmlspecialchars() を使用します。

パラメータ

  • str(string):入力文字列。
  • allowable_tags(string):取り除かないタグを指定できます(オプション)。
注意:
HTML コメントや PHP タグも削除されるようになりました。この機能はハードコードされており、 allowable_tags で変更することはできません。
PHP 5.3.4 以降では、str で使えるのは自己終了型でない XHTML タグだけになりました。 自己終了型の XHTML タグは無視されます。

戻り値

タグを除去した文字列を返します。

警告
strip_tags() は HTML の検証を行わないため、 不完全または壊れたタグにより予想以上に多くのテキスト/データが削除される可能性があります。
この関数は、allowable_tags で許可した全てのタグの属性を修正しません。 これには、style および onmouseover属性が含まれており、 悪意のあるユーザーが他のユーザーに見せるようなテキストを投稿する際に危険な行為を行う可能性があります。

以下はサンプルです。

<?php
$text = '<p>テスト</p><!-- HTML コメント --> <a href="#fragment">リンク</a>';
echo "<strong>タグを削除</strong><br>";
echo strip_tags($text);
echo "<br><strong>p と a は許可</strong><br>";
echo strip_tags($text, '<p><a>');
echo "<br><strong>エスケープ処理後</strong><br>";
echo htmlspecialchars(strip_tags($text, '<p><a>'));
?>
タグを削除
テスト リンク

p と a は許可

テスト

リンク

エスケープ処理後
<p>テスト</p> <a href="#fragment">リンク</a>

改行タグの挿入

改行文字の前に HTML の改行タグを挿入するのが、nl2br() 関数です。

以下が構文です。

string nl2br ( string $string [, bool $is_xhtml = true ] )

string に含まれるすべての改行文字 (\r\n、 \n\r、\n および \r) の前に '<br />' あるいは '<br>' を挿入して返します。

パラメータ

  • string(string):入力文字列。
  • is_xhtml(bool):XHTML 準拠の改行を使うか否か(オプション)。デフォルトは true。

戻り値

変更(改行タグ挿入)後の文字列を返します。

以下がサンプルです。

<?php
echo nl2br("foo isn't\n bar");
echo "<br><strong>HTML の出力</strong><br>";
echo htmlspecialchars(nl2br("foo isn't\n bar"));
echo "<br><strong>第2パラメータに false を指定した場合</strong><br>";
echo htmlspecialchars(nl2br("foo isn't\n bar", false));
?>
foo isn't
bar
HTML の出力
foo isn't<br /> bar
第2パラメータに false を指定した場合
foo isn't<br> bar

以下は、フォームのテキストエリアから送信された文字列を取得して、改行を反映して表示する例です。

フォーム操作に関しては「フォーム」を参照ください。

<?php
//$_POST['comment']がすでに定義されている(値が送信されている)場合
if(isset($_POST['comment'])) {
  //エスケープ処理
  $textarea = htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');
  //改行タグの挿入
  $textarea_nl2br = nl2br($textarea);
}
?>

<form method="post" action="">
<p> テキストエリア</p>
<textarea name="comment" rows="3" cols="30"><?= @$textarea ?></textarea>
<input type="submit" value="送信">
</form>

<?php
echo '<p>送信された値:</p>';
echo @$textarea_nl2br ;
?>