【PHP8.x】ord関数の使い方
ord関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
ord関数は、文字列の最初のバイトのASCII値を返す関数です。PHP 8において、文字列の先頭文字に対応するASCIIコード(整数値)を取得するために使用されます。この関数は、文字列を構成する個々の文字を数値として扱いたい場合に非常に役立ちます。
具体的には、ord関数は文字列を引数として受け取り、その文字列の最初の文字のASCII値を返します。もし引数が空の文字列だった場合、ord関数はfalseを返します。文字列の2文字目以降のASCII値を取得したい場合は、substr関数などを用いて対象文字を切り出す必要があります。
ord関数の利用例としては、例えば、入力された文字列が特定の文字で始まるかどうかを判定する際に、先頭文字のASCII値を比較するといった処理が考えられます。また、文字列データを暗号化したり、特定の形式に変換したりする際にも、文字コードを操作する目的でord関数が利用されることがあります。
ord関数は、文字コードに関する処理を行う上で基礎となる関数であり、PHPプログラミングにおいて文字列を扱う際には頻繁に利用される関数の一つです。システムエンジニアを目指す上で、文字コードと文字列の関係性を理解し、ord関数を適切に利用できるようになることは、開発スキル向上に繋がります。
構文(syntax)
1ord(string $string): int
引数(parameters)
string $character
- string $character: 文字コードの整数値を取得したい1文字の文字列
戻り値(return)
int
ord関数は、文字列の最初の1文字のASCIIコードを表す整数を返します。
サンプルコード
PHPで文字列配列を先頭文字順にソートする
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列の配列を、各要素の先頭文字のASCII値に基づいてソートします。 7 * 8 * この関数は、PHPの`usort`関数と`ord`関数を利用して、 9 * キーワード "order by" のような振る舞いを実現します。 10 * 11 * @param array<string> $items ソート対象の文字列配列(参照渡し) 12 * @return void 配列は直接変更されるため、戻り値はありません 13 */ 14function sortArrayByFirstCharOrder(array &$items): void 15{ 16 // usortは、ユーザーが定義した比較ロジックに基づいて配列をソートします。 17 // ここでは、比較ロジックにアロー関数を使用しています。 18 // 各文字列 ($a, $b) の最初の1文字を ord() でASCII値 (整数) に変換し、 19 // 宇宙船演算子 (<=>) を使ってそれらの値を比較します。 20 // これにより、文字コード順('Apple', 'Banana', 'Cherry')に配列が並び替えられます。 21 usort($items, fn(string $a, string $b) => ord($a[0]) <=> ord($b[0])); 22} 23 24// ソート対象となる文字列の配列を定義します 25$fruits = ['Cherry', 'Banana', 'Apple']; 26 27// ソート前の配列を出力します 28echo "ソート前の配列:\n"; 29print_r($fruits); 30/* 31出力: 32Array 33( 34 [0] => Cherry 35 [1] => Banana 36 [2] => Apple 37) 38*/ 39 40// 定義した関数を呼び出し、配列をソートします 41sortArrayByFirstCharOrder($fruits); 42 43// ソート後の配列を出力します 44echo "\nソート後の配列:\n"; 45print_r($fruits); 46/* 47出力: 48Array 49( 50 [0] => Apple 51 [1] => Banana 52 [2] => Cherry 53) 54*/ 55 56?>
このPHPサンプルコードは、文字列で構成された配列を、各要素の先頭文字の順番に基づいて並べ替える(ソートする)方法を示しています。
中心となるのはsortArrayByFirstCharOrder関数です。この関数は、引数としてソート対象の配列を「参照渡し」で受け取ります。参照渡しを使うと、関数内で行った並べ替え操作が、呼び出し元の配列変数に直接反映されるため、この関数の戻り値はvoid(何も返さない)となっています。
実際のソート処理には、ユーザーが定義した比較ルールに従って配列を並べ替えるusort関数が使われています。その比較ルールの中で重要な役割を果たすのがord関数です。ord関数は、引数として与えられた1文字を、その文字に対応する数値(ASCII値)に変換します。サンプルコードでは、比較する二つの文字列($aと$b)の先頭文字($a[0]と$b[0])をそれぞれord関数で数値に変換し、宇宙船演算子<=>でその大小を比較しています。
この一連の処理により、usortは文字列の配列を先頭文字の文字コード順(この例ではアルファベット順)に正しく並べ替えることができます。これはデータベース操作におけるORDER BYのように、特定の基準でデータを並べ替える考え方をコードで実現したものです。
ord()関数は文字列の最初の1バイトの値を返すため、「あ」のような日本語の文字を正しくソートできません。日本語などを扱う場合は、mb_ord()関数の利用を検討してください。このコードは各要素の先頭文字のみで比較するため、「Apple」と「Ant」のように先頭が同じ単語の順序は保証されません。usort()関数は元の配列を直接変更しますので、ソート前のデータを残したい場合は事前にコピーが必要です。配列に空の文字列が含まれているとエラーになる可能性がある点や、大文字と小文字は区別されてソートされる点(例: 'Z'は'a'より前)にも注意しましょう。
PHPで文字コード順に多次元配列をソートする
1<?php 2 3/** 4 * 'grade' キーの値(文字)のASCII値に基づいて多次元配列をソートします。 5 * 6 * この関数は、usortとord関数を組み合わせて、指定されたキーの値(一文字)の 7 * 文字コード順に配列の要素を並べ替えます。 8 * 9 * @param array $array ソート対象の多次元配列 10 * @param string $key ソート基準となる文字が格納されているキー 11 * @return void 配列は参照渡しで直接ソートされます 12 */ 13function sortArrayByCharacterValue(array &$array, string $key): void 14{ 15 // usortは、ユーザー定義の比較ロジックに基づいて配列をソートします。 16 // アロー関数 (fn) を使用して、比較ロジックを簡潔に記述しています。 17 // ord() は、引数で渡された文字のASCII値を返します。 18 // 宇宙船演算子 (<=>) は、2つの値を比較し、-1, 0, 1 のいずれかを返します。 19 // これにより、'grade' の文字コード順 (A, B, C...) に配列がソートされます。 20 usort($array, fn($a, $b) => ord($a[$key]) <=> ord($b[$key])); 21} 22 23// ソート対象となる多次元配列を定義します。 24$data = [ 25 ['id' => 1, 'name' => 'Desk', 'grade' => 'C'], 26 ['id' => 2, 'name' => 'Chair', 'grade' => 'A'], 27 ['id' => 3, 'name' => 'Lamp', 'grade' => 'B'], 28 ['id' => 4, 'name' => 'Book', 'grade' => 'A'], 29 ['id' => 5, 'name' => 'Pen', 'grade' => 'D'], 30]; 31 32// 'grade' キーを基準に配列をソートします。 33sortArrayByCharacterValue($data, 'grade'); 34 35// ソート後の配列を整形して出力します。 36print_r($data); 37 38?>
このサンプルコードは、PHPのord関数を利用して、多次元配列を特定のキーの値(一文字)のASCII値に基づいてソートする方法を示しています。多次元配列とは、複数の情報を持つ要素がリストのように並んだデータ構造のことです。
まず、sortArrayByCharacterValue関数は、ソート対象となる多次元配列と、ソートの基準となる文字が格納されているキーの名前を引数として受け取ります。引数として渡される配列は参照渡しされるため、関数内でソートが完了すると、元の配列が直接変更されます。この関数の戻り値はvoidであり、特に値は返しません。
関数内部では、usort関数が実際のソート処理を行います。usortは、ユーザーが定義した比較ロジックに基づいて配列の要素を並べ替えるための関数です。比較ロジックは、PHP 8で導入された短縮記法であるアロー関数 fn($a, $b) => ... で記述されています。この関数は、配列から取り出された2つの要素 $a と $b を受け取って比較します。
比較の核となるのがord関数です。ord(string $character)は、引数として渡された1文字のASCII値(文字コードに対応する数値)を整数で返します。例えば、ord('A')は65、ord('B')は66といった値になります。これにより、文字を数値として大小比較することが可能になります。
2つの文字のASCII値を比較するために、宇宙船演算子 <=> が使用されます。この演算子は、左辺が右辺より小さければ-1、等しければ0、大きければ1を返します。この戻り値の形式がusortが求める比較関数の結果と一致するため、指定されたキーの文字コード順に配列がソートされます。
サンプルでは、$dataという多次元配列が定義されており、sortArrayByCharacterValue($data, 'grade');を呼び出すことで、各要素の'grade'キーの値('C', 'A', 'B'など)に基づいて配列がソートされ、最終的にソートされた配列の内容がprint_rで出力されます。
ord関数は文字列の最初の1バイトの値を返すため、ソート基準の値が複数文字の場合、意図通りに動作しない点に注意が必要です。また、ASCII値で比較するため、'A'と'a'のような大文字と小文字は区別されます。日本語などのマルチバイト文字には対応しておらず、正しくソートできません。このコードで定義されている関数は、引数の配列を直接書き換える「参照渡し」で動作します。そのため、元の配列データが変更されることを理解しておくことが重要です。さらに、コード内で使われているアロー関数 fn はPHP 7.4以降で利用可能な構文であり、古いバージョンでは動作しません。