PHPでdiff | 配列から文字列までの差分比較に対応する方法

PHPでdiff (差分比較) に対応する方法をまとめて紹介します。

ソフトウェア開発やテキストデータの編集において、差分検出の重要性があります。ソースコードの変更、テキストファイルの更新、データの違いを正確に把握することは、問題の特定や効率的な作業に欠かせません。

この記事では、PHPを使った差分検出の方法について探求します。配列から文字列まで、広範なデータ構造とケースに対応する方法に焦点を当てて紹介していきます。

PHPを使用したアプリケーション開発の中で、入力テキストの差分を出す方法を習得する事で、ご自分のプロジェクトをより良い物にしてください。

配列の差分比較

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' の指定からもわかるように、キーは比較対象にならず、値のみを比較して差分を出力します。

文字列の差分比較

文字列の差分を出すにはライブラリを使用します。

https://github.com/jfcherng/php-diff

テキスト形式やHTML形式での出力に対応しています。

こちらのライブラリに付属している example/ 配下のコードで挙動を確認してみます。

$ git clone https://github.com/jfcherng/php-diff.git
$ cd php-diff/
$ composer install
$ cd examle/

比較するサンプルファイルはデフォルトだと解りづらかったので編集してみました。

$ 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 server

http://localhost:12388/demo_web.php にアクセスした結果

HTML表示では様々なパターンが用意されているので、プロジェクトにあった表示方法を模索してみてください。

日付の差分比較

何日前、何日後など、日数の比較をする方法です。

<?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 days

PHPマニュアル: https://www.php.net/manual/ja/datetime.diff.php

終わりに

以上、PHPでdiffとして差分比較をするための方法でした。

私自身、diffというと diffコマンドやgit diffなど文字列での比較をイメージしていたのですが、配列や日付など、様々なdiffが用意されている事がわかりました。

ご自分のプロジェクトにあった差分比較を使いこなして活用していってください。

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA