【PHP8.x】str_decrement関数の使い方

str_decrement関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

str_decrement関数は、文字列に含まれる数値や特定の順序を持つ文字を、定義された規則に従い一つ前の状態に減少させる操作を実行する関数です。

この関数は、例えば「item-003」といった連番文字列を「item-002」へと変更したり、アルファベットの順序を逆行させたりする際に用います。これにより、特定の命名規則を持つデータに対して、その順序を逆行させるような処理を容易に行うことができます。

str_decrement関数は、処理対象となる文字列を引数として受け取ります。デクリメント処理が成功すると、その結果である新しい文字列が戻り値として返されます。元の文字列は変更されず、常に加工された新しい文字列が生成されるため、安全に利用できます。

本関数は、ログファイル名、バージョンタグ、データベースIDなど、順序付けられた文字列データの管理において、前の状態へ戻す必要がある場合に特に有効です。デクリメント不可能な入力や無効な引数が与えられた場合、エラーを示す値(例えば false など)を返すことがありますので、関数の戻り値を確認することが重要です。

構文(syntax)

1function str_decrement(string $string): string
2{
3}

引数(parameters)

string $string

  • string $string: 1文字減らす対象の文字列を指定します。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP: 文字列末尾の数字をデクリメントする

1<?php
2
3/**
4 * 文字列の末尾にある数字部分をデクリメントする関数です。
5 *
6 * この関数は、PHPの標準関数には存在しない架空の 'str_decrement' を模範して作成されています。
7 * 戻り値がないため、引数の文字列を直接変更します(参照渡し)。
8 * 末尾に数字がない場合、またはデクリメント結果が負の値になる場合は、文字列は変更されません。
9 * (デクリメント結果が0を下回る場合、0に丸められます。)
10 *
11 * @param string $string デクリメント対象の文字列。参照渡し。
12 * @return void
13 */
14function str_decrement(string &$string): void
15{
16    // 文字列の末尾が1つ以上の数字で構成されているかチェックし、その部分を抽出します。
17    if (preg_match('/(\d+)$/', $string, $matches)) {
18        $numberPart = $matches[1]; // 末尾の数字部分 (例: '10')
19        $prefix = substr($string, 0, -strlen($numberPart)); // 数字より前の部分 (例: 'product')
20
21        // 数字部分を整数に変換してデクリメントします。
22        $decrementedNumber = (int) $numberPart - 1;
23
24        // デクリメント結果が0未満になる場合、0に丸めます。
25        // また、元の数字部分の桁数を維持して、文字列形式に戻します。
26        // 例: '010' -> '009', '00' -> '00'
27        $newNumberPart = sprintf('%0' . strlen($numberPart) . 'd', max(0, $decrementedNumber));
28
29        // 更新された文字列を元の変数に代入します。
30        $string = $prefix . $newNumberPart;
31    }
32    // 末尾に数字がない場合は何もしません。
33}
34
35// --- 使用例 ---
36
37$itemCode1 = "product10";
38echo "元: " . $itemCode1 . PHP_EOL; // 出力: 元: product10
39str_decrement($itemCode1);
40echo "後: " . $itemCode1 . PHP_EOL; // 出力: 後: product09
41
42$itemCode2 = "task01";
43echo "元: " . $itemCode2 . PHP_EOL; // 出力: 元: task01
44str_decrement($itemCode2);
45echo "後: " . $itemCode2 . PHP_EOL; // 出力: 後: task00
46
47$itemCode3 = "version00";
48echo "元: " . $itemCode3 . PHP_EOL; // 出力: 元: version00
49str_decrement($itemCode3);
50echo "後: " . $itemCode3 . PHP_EOL; // 出力: 後: version00 (0以下は0に丸められる)
51
52$plainText = "hello_world";
53echo "元: " . $plainText . PHP_EOL; // 出力: 元: hello_world
54str_decrement($plainText);
55echo "後: " . $plainText . PHP_EOL; // 出力: 後: hello_world (数字がないため変更なし)
56
57$mixedAlphaNum = "ab123";
58echo "元: " . $mixedAlphaNum . PHP_EOL; // 出力: 元: ab123
59str_decrement($mixedAlphaNum);
60echo "後: " . $mixedAlphaNum . PHP_EOL; // 出力: 後: ab122
61
62?>

PHPのstr_decrement関数は、文字列の末尾にある数字部分を1つ減らす(デクリメントする)機能を持ちます。この関数はPHPの標準関数には存在しませんが、文字列操作の理解を深めるために作成された架空の関数です。

引数にはstring $stringを指定し、この引数は参照渡しとなります。そのため、関数内で渡された文字列そのものが直接変更され、関数は戻り値を返しません(void)。

具体的な動作として、文字列の末尾に1つ以上の数字が連続している部分が見つかった場合、その数字を1減らして更新します。例えば、「product10」が「product09」に、「task01」が「task00」のように変更されます。この際、元の数字部分が持つ桁数(例えば「01」の「0」)は維持されます。

もし文字列の末尾に数字が見つからない場合は、文字列は変更されません。また、デクリメントの結果が0を下回る場合でも、数字は0に丸められ、それ以上は減少しません。例えば、「version00」をデクリメントしても「version00」のままとなります。

このstr_decrement関数はPHPに標準で存在しないため、利用するにはこのコードを別途定義する必要があります。引数に渡した変数の値が直接書き換わる「参照渡し」の関数であるため、元の変数を保持したい場合は事前に複製してください。文字列の末尾に数字がない場合や、デクリメント結果が0を下回る場合は文字列が変更されないか、0に丸められます。特に元の数字部分の桁数を維持して「00」のように出力される点にご注意ください。意図しない文字列の変更を避けるため、対象文字列のフォーマットを事前に確認することをおすすめします。

関連コンテンツ