配列ヘルパー

配列ヘルパーは、配列のより複雑な使用方法を簡素化するいくつかの関数を提供します。PHPが提供する既存の機能を複製することを意図したものではありません。- 使用方法を大幅に簡素化する場合を除きます。

このヘルパーの読み込み

このヘルパーは以下のコードを使用して読み込みます。

<?php

helper('array');

使用可能な関数

以下の関数が使用できます。

パラメーター:
  • $search (string) – 配列を検索する方法を記述するドット表記文字列

  • $values (array) – 検索対象の配列

戻り値:

配列内で見つかった値、またはnull

戻り値の型:

mixed

このメソッドを使用すると、ドット表記を使用して配列から特定のキーを検索でき、「*」ワイルドカードを使用できます。次の配列を例に取ると

<?php

$data = [
    'foo' => [
        'buzz' => [
            'fizz' => 11,
        ],
        'bar' => [
            'baz' => 23,
        ],
    ],
];

「foo.buzz.fizz」という検索文字列を使用することで、「fizz」の値を見つけることができます。同様に、「foo.bar.baz」を使用してbazの値を見つけることができます。

<?php

// Returns: 11
$fizz = dot_array_search('foo.buzz.fizz', $data);

// Returns: 23
$baz = dot_array_search('foo.bar.baz', $data);

アスタリスクをワイルドカードとして使用して、セグメントのいずれかを置き換えることができます。見つかった場合、子ノードすべてを検索して見つけます。これは、値が不明な場合や、値の数値インデックスがある場合に便利です。

<?php

// Returns: 23
$baz = dot_array_search('foo.*.baz', $data);

配列キーにドットが含まれている場合は、バックスラッシュを使用してエスケープできます。

<?php

$data = [
    'foo' => [
        'bar.baz' => 23,
    ],
    'foo.bar' => [
        'baz' => 43,
    ],
];

// Returns: 23
$barBaz = dot_array_search('foo.bar\.baz', $data);
// Returns: 43
$fooBar = dot_array_search('foo\.bar.baz', $data);

注記

v4.2.0より前では、dot_array_search('foo.bar.baz', ['foo' => ['bar' => 23]])はバグにより23を返していました。v4.2.0以降はnullを返します。

パラメーター:
  • $key (mixed) – 対象キー

  • $array (array) – 検索対象の配列

戻り値:

配列内で見つかった値、またはnull

戻り値の型:

mixed

深さが不明な配列内のキー値を持つ要素の値を返します。

array_sort_by_multiple_keys(array &$array, array $sortColumns)
パラメーター:
  • $array (array) – 並べ替え対象の配列(参照渡し)。

  • $sortColumns (array) – 並べ替え後の配列キーと、連想配列としての対応するPHPソートフラグ。

戻り値:

並べ替えが成功したかどうか。

戻り値の型:

bool

このメソッドは、多次元配列の要素を、階層的な方法で1つ以上のキーの値でソートします。例えば、モデルのfind()関数が返す可能性のある次の配列を考えます。

<?php

$players = [
    0 => [
        'name'     => 'John',
        'team_id'  => 2,
        'position' => 3,
        'team'     => [
            'id'    => 1,
            'order' => 2,
        ],
    ],
    1 => [
        'name'     => 'Maria',
        'team_id'  => 5,
        'position' => 4,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    2 => [
        'name'     => 'Frank',
        'team_id'  => 5,
        'position' => 1,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
];

この配列を2つのキーでソートします。このメソッドは、より深い配列レベルの値にアクセスするためにドット表記をサポートしますが、ワイルドカードはサポートしません。

<?php

array_sort_by_multiple_keys($players, [
    'team.order' => SORT_ASC,
    'position'   => SORT_ASC,
]);

$players配列は、各プレイヤーの「team」サブ配列内の「order」値でソートされるようになりました。この値が複数のプレイヤーで等しい場合、これらのプレイヤーは「position」でソートされます。結果の配列は次のようになります。

<?php

$players = [
    0 => [
        'name'     => 'Frank',
        'team_id'  => 5,
        'position' => 1,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    1 => [
        'name'     => 'Maria',
        'team_id'  => 5,
        'position' => 4,
        'team'     => [
            'id'    => 5,
            'order' => 1,
        ],
    ],
    2 => [
        'name'     => 'John',
        'team_id'  => 2,
        'position' => 3,
        'team'     => [
            'id'    => 1,
            'order' => 2,
        ],
    ],
];

同様に、このメソッドはオブジェクトの配列も処理できます。上記の例では、「player」が配列で、「teams」がオブジェクトで表される可能性があります。メソッドは各ネストレベルの要素の型を検出し、それに応じて処理します。

array_flatten_with_dots(iterable $array[, string $id = '']) array
パラメーター:
  • $array (iterable) – 平坦化する多次元配列

  • $id (string) – 外側のキーにプレフィックスとして追加するオプションのID。キーの平坦化のために内部的に使用されます。

戻り値の型:

array

戻り値:

平坦化された配列

この関数は、キーのセパレーターとしてドットを使用して、多次元配列を単一のキー値配列に平坦化します。

<?php

$arrayToFlatten = [
    'personal' => [
        'first_name' => 'john',
        'last_name'  => 'smith',
        'age'        => '26',
        'address'    => 'US',
    ],
    'other_details' => 'marines officer',
];

$flattened = array_flatten_with_dots($arrayToFlatten);

調査すると、$flattenedは次のようになります。

<?php

[
    'personal.first_name' => 'john',
    'personal.last_name'  => 'smith',
    'personal.age'        => '26',
    'personal.address'    => 'US',
    'other_details'       => 'marines officer',
];

ユーザーは独自に$idパラメーターを使用できますが、必須ではありません。この関数は、平坦化されたキーを追跡するために内部的にこのパラメーターを使用します。ユーザーが初期の$idを提供する場合、すべてのキーにプレフィックスとして追加されます。

<?php

// using the same data from above
$flattened = array_flatten_with_dots($arrayToFlatten, 'foo_');
/*
 * $flattened is now:
 * [
 *     'foo_personal.first_name' => 'john',
 *     'foo_personal.last_name'  => 'smith',
 *     'foo_personal.age'        => '26',
 *     'foo_personal.address'    => 'US',
 *     'foo_other_details'       => 'marines officer',
 * ]
 */
array_group_by(array $array, array $indexes[, bool $includeEmpty = false]) array
パラメーター:
  • $array (array) – データ行(ほとんどの場合、クエリ結果から取得)。

  • $indexes (array) – 値をグループ化するインデックス。ドット構文に従います。

  • $includeEmpty (bool) – trueの場合、null''の値はフィルターされません。

戻り値の型:

array

戻り値:

インデックス値でグループ化された配列

この関数は、インデックス値でデータ行をグループ化できます。返される配列の深さは、パラメーターとして渡されたインデックスの数に等しくなります。

この例は、(例:APIから読み込まれた)ネストされた配列を持ついくつかのデータを示しています。

<?php

$employees = [
    [
        'id'         => 1,
        'first_name' => 'Urbano',
        'gender'     => null,
        'hr'         => [
            'country'    => 'Canada',
            'department' => 'Engineering',
        ],
    ],
    [
        'id'         => 2,
        'first_name' => 'Case',
        'gender'     => 'Male',
        'hr'         => [
            'country'    => null,
            'department' => 'Marketing',
        ],
    ],
    [
        'id'         => 3,
        'first_name' => 'Emera',
        'gender'     => 'Female',
        'hr'         => [
            'country'    => 'France',
            'department' => 'Engineering',
        ],
    ],
    [
        'id'         => 4,
        'first_name' => 'Richy',
        'gender'     => null,
        'hr'         => [
            'country'    => null,
            'department' => 'Sales',
        ],
    ],
    [
        'id'         => 5,
        'first_name' => 'Mandy',
        'gender'     => null,
        'hr'         => [
            'country'    => 'France',
            'department' => 'Sales',
        ],
    ],
    [
        'id'         => 6,
        'first_name' => 'Risa',
        'gender'     => 'Female',
        'hr'         => [
            'country'    => null,
            'department' => 'Engineering',
        ],
    ],
    [
        'id'         => 7,
        'first_name' => 'Alfred',
        'gender'     => 'Male',
        'hr'         => [
            'country'    => 'France',
            'department' => 'Engineering',
        ],
    ],
    [
        'id'         => 8,
        'first_name' => 'Tabby',
        'gender'     => 'Male',
        'hr'         => [
            'country'    => 'France',
            'department' => 'Marketing',
        ],
    ],
    [
        'id'         => 9,
        'first_name' => 'Ario',
        'gender'     => 'Male',
        'hr'         => [
            'country'    => null,
            'department' => 'Sales',
        ],
    ],
    [
        'id'         => 10,
        'first_name' => 'Somerset',
        'gender'     => 'Male',
        'hr'         => [
            'country'    => 'Germany',
            'department' => 'Marketing',
        ],
    ],
];

まず「gender」で、次に「hr.department」(最大深さ=2)でグループ化します。まず、空の値を除外した場合の結果を示します。

<?php

$result = array_group_by($employees, ['gender', 'hr.department']);

$result = [
    'Male' => [
        'Marketing' => [
            [
                'id'         => 2,
                'first_name' => 'Case',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Marketing',
                ],
            ],
            [
                'id'         => 8,
                'first_name' => 'Tabby',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Marketing',
                ],
            ],
            [
                'id'         => 10,
                'first_name' => 'Somerset',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'Germany',
                    'department' => 'Marketing',
                ],
            ],
        ],
        'Engineering' => [
            [
                'id'         => 7,
                'first_name' => 'Alfred',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Engineering',
                ],
            ],
        ],
        'Sales' => [
            [
                'id'         => 9,
                'first_name' => 'Ario',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Sales',
                ],
            ],
        ],
    ],
    'Female' => [
        'Engineering' => [
            [
                'id'         => 3,
                'first_name' => 'Emera',
                'gender'     => 'Female',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Engineering',
                ],
            ],
            [
                'id'         => 6,
                'first_name' => 'Risa',
                'gender'     => 'Female',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Engineering',
                ],
            ],
        ],
    ],
];

そして、今度は空の値を含めるようにした場合の同じコードです。

<?php

$result = array_group_by($employees, ['gender', 'hr.department'], true);

$result = [
    '' => [
        'Engineering' => [
            [
                'id'         => 1,
                'first_name' => 'Urbano',
                'gender'     => null,
                'hr'         => [
                    'country'    => 'Canada',
                    'department' => 'Engineering',
                ],
            ],
        ],
        'Sales' => [
            [
                'id'         => 4,
                'first_name' => 'Richy',
                'gender'     => null,
                'hr'         => [
                    'country'    => null,
                    'department' => 'Sales',
                ],
            ],
            [
                'id'         => 5,
                'first_name' => 'Mandy',
                'gender'     => null,
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Sales',
                ],
            ],
        ],
    ],
    'Male' => [
        'Marketing' => [
            [
                'id'         => 2,
                'first_name' => 'Case',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Marketing',
                ],
            ],
            [
                'id'         => 8,
                'first_name' => 'Tabby',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Marketing',
                ],
            ],
            [
                'id'         => 10,
                'first_name' => 'Somerset',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'Germany',
                    'department' => 'Marketing',
                ],
            ],
        ],
        'Engineering' => [
            [
                'id'         => 7,
                'first_name' => 'Alfred',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Engineering',
                ],
            ],
        ],
        'Sales' => [
            [
                'id'         => 9,
                'first_name' => 'Ario',
                'gender'     => 'Male',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Sales',
                ],
            ],
        ],
    ],
    'Female' => [
        'Engineering' => [
            [
                'id'         => 3,
                'first_name' => 'Emera',
                'gender'     => 'Female',
                'hr'         => [
                    'country'    => 'France',
                    'department' => 'Engineering',
                ],
            ],
            [
                'id'         => 6,
                'first_name' => 'Risa',
                'gender'     => 'Female',
                'hr'         => [
                    'country'    => null,
                    'department' => 'Engineering',
                ],
            ],
        ],
    ],
];