【PHP】PHP8.4で新しく提案された配列検索関数

PHP

Laravel Newsで2024/05/21に掲載された内容ですが、PHP8.4で新しく提案された配列検索関数についての内容です。元記事の日本語自動翻訳と、一部コメントを追記しています。

New Proposed Array Find Functions in PHP 8.4 - Laravel News
Four new array functions are likely coming to PHP 8.4 that are still in the RFC voting stage. Learn about these array_fi...

PHP 8.4 には、まだ RFC 投票段階にある 4 つの新しい配列関数が追加される可能性があります。これまでのところ、投票はすでに 100% の「はい」投票であり、投票は 2024 年 5 月 29 日に終了します。これらの関数の RFC 承認は保留中ですが、これらの関数は PHP 8.4 に導入される可能性が高いようです。

  • array_find()
  • array_find_key()
  • array_any()
  • array_all()

array_find() 関数

array_find($array, $callback) 関数は、$callback が true を返す最初の要素を返します。

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
array_find($array, function (string $value) {
    return strlen($value) > 4; // 文字数が4を超える
}); // string(5) "goose" 👈5文字
 
array_find($array, function (string $value) {
    return str_starts_with($value, 'f'); // 「f」で始まる
}); // null
 
// 配列キーが動物の最初のシンボルである最初の動物を見つける
array_find($array, function (string $value, $key) {
   return $value[0] === $key; // 最初の1文字がハッシュキーと一致
}); // string(3) 'cow'

Laravel の Arr または Collection を使用すると、first() メソッドとクロージャを組み合わせて同等の機能を得ることができます。

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
 
$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
new Collection($array)
    ->first(fn ($value) => strlen($value) > 4); // goose
 
Arr::first(
    $array,
    fn ($value) => str_starts_with($value, 'f')
); // null
 
new Collection($array)
    ->first(fn ($value, $key) => $value[0] === $key); // cow

追加の括弧なしでクラスのインスタンス化を示していることに注意してください。これは PHP 8.4 にもあるはずです。

array_find_key() 関数

array_find_key($array, $callback) 関数は、$callback が true を返す最初の要素のキーを返します。 array_find() と同様に、一致する要素が見つからない場合は null を返します。

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
array_find_key($array, function (string $value) {
    return strlen($value) > 4;
}); // string(1) "e"
 
array_find_key($array, function (string $value) {
    return str_starts_with($value, 'f');
}); // null
 
array_find_key($array, function (string $value, $key) {
   return $value[0] === $key;
}); // string(1) "c"

この関数の RFC 実装は次のようになります。

function array_find_key(array $array, callable $callback): mixed {
    foreach ($array as $key => $value) { // 配列を順次ループ
        if ($callback($value, $key)) { // コールバック実行してtrue返る場合
            return $key; // 配列キーを返す
        }
    }
 
    return null;
}

Laravel のコレクションを使用すると、クロージャと組み合わせて search() メソッドと同様の機能を取得できます。ただし、項目が見つからない場合、search() は null ではなく false を返します。

use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
 
new Collection($array)->search(function (string $value) {
    return strlen($value) > 4;
}); // string(1) "e"
 
new Collection($array)->search(function (string $value) {
    return str_starts_with($value, 'f');
    // return str_starts_with($value, 'f') ?? null; にすれば同等
}); // false
 
new Collection($array)->search(function (string $value, $key) {
   return $value[0] === $key;
}); // string(1) "c"

array_any() と array_all() 関数

RFC の 2 番目の部分 (および別の 2/3 の投票) には、array_any() 関数と array_all() 関数が含まれています。これらの関数は、配列内のいずれかの項目が array_any() に対して true を返す場合、および配列内のすべての項目が array_all() に対して true を返す場合に、それぞれ使用できます。

※ ちょっと、何言っているのか判りにくいですね。。

※ true/falseを返すのは第二引数のコールバックのことです。

※ また、両関数の戻り値は boolean (true / false) です。

※ コードを見た方が判りやすいと思います。

$array = [
    'a' => 'dog',
    'b' => 'cat',
    'c' => 'cow',
    'd' => 'duck',
    'e' => 'goose',
    'f' => 'elephant'
];
 
// 動物の名前が 5 文字を超えているかどうかを確認
array_any($array, function (string $value) {
    return strlen($value) > 5;
}); // bool(true)
 
// 3文字未満の動物名がないか確認
array_any($array, function (string $value) {
    return strlen($value) < 3;
}); // bool(false)
 
// すべての動物の名前が 12 文字未満であるか確認
array_all($array, function (string $value) {
    return strlen($value) < 12;
}); // bool(true)
 
// すべての動物の名前が 5 文字を超えているか確認
array_all($array, function (string $value) {
    return strlen($value) > 5;
}); // bool(false)

もっと詳しく知る

この提案された変更に関する詳細はすべて RFC(英語) で読むことができます。この機能は PHP 8.4 で削除される可能性があります。これらの関数の実装は現在ドラフト段階にあり、GitHub で見つけることができます。

コメント

タイトルとURLをコピーしました