「diff php」でPHPの差分を取る方法(最短の結論)
「diff php」と検索してたどり着いた方向けに、まず結論だけ先にまとめます。PHPでdiffを取る=2つのデータの差分を抽出するということですが、対象が「配列」「文字列」「日付」のどれかで使う関数が変わります。もっとも多い配列の差分は、標準の array_diff 関数だけで完結します。
<?php
// PHPでdiffを取る最短サンプル(配列の差分)
$before = ['apple', 'banana', 'orange'];
$after = ['apple', 'grape'];
// $before にあって $after にない要素を取り出す
$diff = array_diff($before, $after);
print_r($diff);
// Array ( [1] => banana [2] => orange )
文字列の類似度なら similar_text / levenshtein、日付の差分なら DateTime::diff、git diff のような行単位の差分表示ならライブラリを使います。それぞれの用途別の使い分けと具体的なコードは、以下で順番に解説します。
PHPでdiff (差分比較) に対応する方法をまとめて紹介します。
ソフトウェア開発やテキストデータの編集において、差分検出の重要性があります。ソースコードの変更、テキストファイルの更新、データの違いを正確に把握することは、問題の特定や効率的な作業に欠かせません。
この記事では、PHPを使った差分検出の方法について探求します。配列から文字列まで、広範なデータ構造とケースに対応する方法に焦点を当てて紹介していきます。
PHPを使用したアプリケーション開発の中で、入力テキストの差分を出す方法を習得する事で、ご自分のプロジェクトをより良い物にしてください。
PHPのdiff(差分比較)は用途で使い分ける
ひとくちに「PHPでdiff(差分比較)」といっても、配列の差分・文字列の差分・日付の差分とでは、使うべき手段がまったく異なります。まずは用途ごとに、PHP標準関数だけで済むのか、それとも外部ライブラリが必要になるのかを整理しておきましょう。
| 用途 | 代表的な手段 | 標準/ライブラリ |
|---|---|---|
| 配列の差分(要素の増減) | array_diff / array_diff_key / array_diff_assoc | PHP標準関数 |
| 文字列の一致・類似度 | similar_text / levenshtein | PHP標準関数 |
| 文字列の行単位diff(差分表示) | jfcherng/php-diff などのライブラリ | ライブラリが必要 |
| 日付・日数の差分 | DateTime::diff / date_diff | PHP標準関数 |
「どの要素が増減したか」を知りたいだけなら、標準の array_diff 系や日付の diff メソッドで十分に対応できます。一方で、diff コマンドや git diff のように行単位の変更点を色付きで表示したい場合は、標準関数だけでは実現できないためライブラリを利用します。以下、用途別に具体的な実装を見ていきます。
配列の差分比較
array_diff関数を使用します。
<?php
// 2つの配列を定義します
$array1 = array('apple', 'banana', 'orange', 'grape', 'a' => 'kiwi');
$array2 = array('banana', 'kiwi', 'grape', 'pineapple');
// 第1引数($array1)の配列のみに存在する値を差分として取得します
$difference = array_diff($array1, $array2);
echo "配列1の要素: " . implode(', ', $array1) . "\n";
// 配列1の要素: apple, banana, orange, grape, kiwi
echo "配列2の要素: " . implode(', ', $array2) . "\n";
// 配列2の要素: banana, kiwi, grape, pineapple
echo "差分の要素: " . implode(', ', $difference) . "\n";
// 差分の要素: apple, orange
PHP公式マニュアルはこちら: https://www.php.net/manual/ja/function.array-diff.php
array_diff関数は配列を渡して差分を取得する事ができます。第1引数に渡した配列にのみ存在する値を検知する事ができ、第2引数以降には配列を複数指定することも可能です。
'a' => 'kiwi' の指定からもわかるように、キーは比較対象にならず、値のみを比較して差分を出力します。
キーも含めて比較したい場合や、連想配列の差分を取りたい場合は、用途に応じて array_diff の関連関数を使い分けます。
| 関数 | 比較対象 | 用途の例 |
|---|---|---|
array_diff | 値のみ(キーは無視) | リストからの要素の増減を検出 |
array_diff_key | キーのみ | 設定項目のキーが増減したかを確認 |
array_diff_assoc | キーと値の両方 | 連想配列で値が変わった項目を検出 |
array_udiff | コールバックで独自比較 | オブジェクトの配列を任意条件で比較 |
たとえば、同じキーを持つ2つの連想配列で「値が変更された項目だけ」を抽出したいときは array_diff_assoc が便利です。
文字列の差分比較
文字列の差分を出すにはライブラリを使用します。
https://github.com/jfcherng/php-diff

テキスト形式やHTML形式での出力に対応しています。
こちらのライブラリに付属している example/ 配下のコードで挙動を確認してみます。
$ git clone https://github.com/jfcherng/php-diff.git
$ cd php-diff/
$ composer install
$ cd example/比較するサンプルファイルはデフォルトだと解りづらかったので編集してみました。
$ cat new_file.txt
1
2
3
4
5
123
456
あいうえお
$ cat old_file.txt
1
2
3
4
5
1243
456
789
あいえお
かきくけこ
$ diff new_file.txt old_file.txt
6c6
< 123
---
> 1243
8c8,10
< あいうえお
---
> 789
> あいえお
> かきくけこコマンドラインで php demo_cli.php を実行した結果

HTMLで差分を表示するサンプルはこちら
composer run-script serverhttp://localhost:12388/demo_web.php にアクセスした結果

HTML表示では様々なパターンが用意されているので、プロジェクトにあった表示方法を模索してみてください。
なお、行単位の差分表示までは必要なく、2つの文字列がどれくらい似ているかを数値で知りたいだけであれば、PHP標準の similar_text(一致する文字数と一致率を取得)や levenshtein(編集距離を取得)でライブラリなしに対応できます。単純に前方一致・部分一致で判定したいだけの場合は、PHPで前方一致を判定する方法(str_starts_withとstrposの使い分け)もあわせて確認してみてください。
日付の差分比較
何日前、何日後など、日数の比較をする方法です。
<?php
$origin = new DateTimeImmutable('2023-08-30');
$target = new DateTimeImmutable('2023-09-02');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');
echo "\n";
$origin = date_create('2023-08-30');
$target = date_create('2023-08-23');
$interval = date_diff($origin, $target);
echo $interval->format('%R%a days');
echo "\n";
$ php date.php
+3 days
-7 daysPHPマニュアル: https://www.php.net/manual/ja/datetime.diff.php
diff が返す DateInterval は、format() に渡すフォーマット文字を変えることで、日数だけでなく「何年何ヶ月」「何時間何分」といった単位でも差分を取得できます。
| フォーマット | 取得できる値 |
|---|---|
%a | 2つの日付の総日数 |
%y / %m / %d | 年数 / 月数 / 日数(各単位の内訳) |
%h / %i / %s | 時間 / 分 / 秒 |
%R | 符号(+ または -) |
たとえば「あと何日」だけを知りたいときは %a、締め切りまでの「何時間何分」を表示したいときは %h時間%i分 のように指定します。
終わりに
以上、PHPでdiffとして差分比較をするための方法でした。
私自身、diffというと diffコマンドやgit diffなど文字列での比較をイメージしていたのですが、配列や日付など、様々なdiffが用意されている事がわかりました。
ご自分のプロジェクトにあった差分比較を使いこなして活用していってください。

コメントを残す