Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【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でオブジェクト配列を名前のASCII順にソートする

1<?php
2
3/**
4 * 人を表すクラス
5 * 各人は名前と年齢を持つ
6 */
7class Person
8{
9    public string $name;
10    public int $age;
11
12    /**
13     * Personクラスのコンストラクタ
14     *
15     * @param string $name 人の名前
16     * @param int $age 人の年齢
17     */
18    public function __construct(string $name, int $age)
19    {
20        $this->name = $name;
21        $this->age = $age;
22    }
23}
24
25// ソート対象となるPersonオブジェクトの配列を初期化
26$people = [
27    new Person("Bob", 30),
28    new Person("Alice", 25),
29    new Person("Charlie", 35),
30    new Person("David", 28),
31    new Person("Anna", 22),
32];
33
34echo "--- ソート前 ---\n";
35foreach ($people as $person) {
36    echo "名前: {$person->name}, 年齢: {$person->age}\n";
37}
38
39/**
40 * usort関数を使用して、Personオブジェクトの配列を並び替える
41 * 並び替えの基準は、nameプロパティの最初の文字のASCII値とする
42 *
43 * ord関数は、与えられた文字のASCII値(またはUnicodeコードポイント)を整数で返す
44 * この値を利用して、比較関数が昇順ソートのための差を計算する
45 */
46usort($people, function (Person $a, Person $b): int {
47    // 各オブジェクトのnameプロパティから最初の文字を取得
48    // 文字列は配列のようにアクセスすることで、個々の文字を取得できる
49    $firstCharA = $a->name[0];
50    $firstCharB = $b->name[0];
51
52    // ord関数を使用して、それぞれの文字のASCII値を取得
53    $asciiA = ord($firstCharA);
54    $asciiB = ord($firstCharB);
55
56    // ASCII値の差を返すことで、昇順にソートする
57    // 結果が負の場合、$aは$bより前に来る
58    // 結果が正の場合、$aは$bより後に来る
59    // 結果が0の場合、順序は変わらない
60    return $asciiA - $asciiB;
61});
62
63echo "\n--- ソート後 (名前の最初の文字のASCII値順) ---\n";
64foreach ($people as $person) {
65    echo "名前: {$person->name}, 年齢: {$person->age}\n";
66}

PHPのord関数は、引数として渡された1文字の文字列に対応するASCII値(またはUnicodeコードポイント)を整数で返す関数です。例えば、ord('A')はASCII値の65を返します。

このサンプルコードでは、Personクラスのオブジェクトを要素とする配列を、各オブジェクトのnameプロパティの最初の文字のASCII値に基づいて昇順にソートする方法を示しています。まず、名前と年齢を持つPersonオブジェクトの配列$peopleが初期化されています。

配列のソートにはPHPのusort関数が使用されています。usortは、ユーザーが定義した比較関数を用いて配列の要素を並び替える関数です。この比較関数内でord関数が活用されます。具体的には、比較対象となる2つのPersonオブジェクトから、それぞれのnameプロパティの最初の文字を取り出します。次に、ord関数を使ってこれらの文字のASCII値を取得し、その差を比較結果としてusort関数に返します。この差が負であれば1番目の要素が前に、正であれば2番目の要素が前に来るようソートされ、結果として名前の最初の文字が早い順に配列が並び替えられます。このようにord関数は、文字コードを利用した比較や文字列処理において非常に便利な機能を提供します。

このサンプルコードでは、ord関数で文字のASCII値を取得してオブジェクトをソートしています。ord関数は引数に空の文字列を渡すとエラーとなり、複数文字の文字列の場合は最初の1文字のASCII値のみを返します。したがって、入力文字列が空でないか確認することが重要です。

また、$a->name[0]のように文字列を配列のように扱う方法は、日本語のようなマルチバイト文字の場合、正しく文字を認識できない可能性があります。そのため、mb_substr($a->name, 0, 1)などのマルチバイト対応関数を利用すると、より安全かつ意図した動作になります。usortの比較関数は、負、ゼロ、正のいずれかの値を返すことで要素の順序を決定します。比較結果がゼロの場合、元の要素の順序は保持される保証がない点にご留意ください。

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連想配列をキーASCII昇順ソートする

1<?php
2
3/**
4 * 連想配列をキーの最初の文字のASCII値に基づいて昇順にソートします。
5 *
6 * @param array<string, mixed> $array ソート対象の連想配列
7 * @return array<string, mixed> ソートされた配列
8 */
9function sortArrayByFirstCharAsciiOfKey(array $array): array
10{
11    // uksort関数は、ユーザー定義の比較関数を使用して配列をキーでソートします。
12    // 第一引数にソートしたい配列を、第二引数に比較関数を渡します。
13    uksort($array, function (string $keyA, string $keyB): int {
14        // ord関数は、文字列の最初の文字のASCII値(またはバイト値)を返します。
15        // ここでは、キーの最初の文字を取得し、そのASCII値を取得しています。
16        $asciiA = ord($keyA[0]);
17        $asciiB = ord($keyB[0]);
18
19        // 比較結果を返します。
20        // - 負の値を返す場合: $keyA が $keyB より前に来るように並べられます。
21        // - 0 を返す場合: $keyA と $keyB の順序は変わりません(同値とみなされます)。
22        // - 正の値を返す場合: $keyA が $keyB より後に来るように並べられます。
23        // PHP 7.0以降で導入された宇宙船演算子 (spaceship operator <=> ) を使用すると、
24        // 3つの比較結果(より小さい、等しい、より大きい)を簡潔に表現できます。
25        return $asciiA <=> $asciiB;
26    });
27
28    return $array;
29}
30
31// --- 使用例 ---
32
33// キーが文字列である連想配列を準備します。
34$data = [
35    'banana' => '黄色い果物',
36    'apple' => '赤い果物',
37    'grape' => '紫の果物',
38    'date' => '甘い果物',
39    'cherry' => '小さな赤い果物',
40];
41
42echo "--- ソート前の配列 ---\n";
43print_r($data);
44
45// 関数を呼び出して配列をソートします。
46// 例: 'apple' (ASCII 'a') -> 'banana' (ASCII 'b') の順になります。
47$sortedData = sortArrayByFirstCharAsciiOfKey($data);
48
49echo "\n--- キーの最初の文字のASCII値でソート後の配列 ---\n";
50print_r($sortedData);
51
52?>

このPHPサンプルコードは、連想配列のキーを、そのキーの最初の文字のASCII値に基づいて昇順にソートする方法を示しています。sortArrayByFirstCharAsciiOfKey関数は、uksort関数を使用して、ユーザー定義の比較ロジックで配列のキーを並べ替えます。

比較関数内では、PHPのord関数が重要な役割を果たします。ord関数は、指定された文字列の最初の文字のASCII値(またはバイト値)を整数で返します。引数string $characterにはASCII値を知りたい文字を渡し、戻り値intとしてその文字に対応する数値(ASCII値)が取得されます。このコードでは、比較対象の二つのキーからそれぞれ最初の文字を取り出し、ord関数でそのASCII値を取得しています。

取得した二つのASCII値は、PHP 7.0以降で導入された宇宙船演算子<=>(spaceship operator)によって比較されます。この演算子は、左辺が右辺より小さい場合は-1、等しい場合は0、大きい場合は1を返し、簡潔に比較結果を表現できます。これにより、キーの最初の文字のASCII値が小さいものが先に、大きいものが後に並ぶようにソートが実行されます。結果として、元の配列はキーの最初の文字のASCII値順に並べ替えられた新しい配列として返されます。

このサンプルコードは、連想配列をキーの最初の文字のASCII値に基づいてソートする方法を示しています。ord関数は、指定された文字列の最初の文字のASCII値(バイト値)を整数で取得するために使用されます。uksort関数は、配列のキーをユーザーが定義した比較ロジック(コールバック関数)でソートする際に利用します。この比較関数は、2つのキーを比較し、第一引数が第二引数より小さい場合は負、等しい場合は0、大きい場合は正のいずれかの整数を返さなければなりません。PHP 7以降で導入された宇宙船演算子<=>を用いると、この比較処理を簡潔に記述できるため便利です。キーは常に文字列として扱われますが、$key[0]で最初の文字を取得しているため、もしキーが空文字列だとエラーになる可能性がある点にご注意ください。また、日本語のようなマルチバイト文字のキーでは、ord関数がバイト値を返すため、想定と異なるソート順になる場合があります。

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以降で利用可能な構文であり、古いバージョンでは動作しません。

関連コンテンツ

関連プログラミング言語