배열 헬퍼

배열 헬퍼는 배열의 복잡한 사용을 단순화하는 여러 함수를 제공합니다. PHP가 이미 제공하는 기능을 중복 구현하지 않으며, 사용 편의성을 크게 향상시키는 경우에만 예외로 합니다.

헬퍼 로드

이 헬퍼는 다음 코드를 사용하여 로드합니다:

helper('array');

사용 가능한 함수

다음 함수들을 사용할 수 있습니다:

매개변수:
  • $search (string) – 배열 검색 방법을 설명하는 점 표기법 문자열

  • $values (array) – 검색할 배열

반환:

배열에서 찾은 값, 또는 null

반환 형식:

mixed

이 메서드를 사용하면 점 표기법으로 배열에서 특정 키를 검색할 수 있으며, *와일드카드 사용도 지원합니다. 다음 배열을 예로 들겠습니다:

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

검색 문자열 foo.buzz.fizz를 사용하여 fizz의 값을 찾을 수 있습니다. 마찬가지로 foo.bar.bazbaz의 값을 찾을 수 있습니다:

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

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

별표(*)를 와일드카드로 사용하면 경로의 임의 세그먼트를 대체할 수 있습니다. 일치하는 항목이 있으면 찾을 때까지 모든 자식 노드를 탐색합니다. 값을 모르거나 숫자 인덱스를 가진 경우에 유용합니다:

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

배열 키에 점(.)이 포함된 경우, 백슬래시(\)로 이스케이프할 수 있습니다:

$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

이 메서드는 다차원 배열의 요소를 하나 이상의 키 값을 기준으로 계층적으로 정렬합니다. 예를 들어 모델의 find() 함수에서 반환될 수 있는 다음 배열을 살펴보겠습니다:

$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,
        ],
    ],
];

이제 이 배열을 두 개의 키를 기준으로 정렬해 보겠습니다. 이 메서드는 깊은 배열 레벨의 값에 접근하는 점 표기법을 지원하지만, 와일드카드는 지원하지 않습니다:

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

$players 배열은 이제 각 플레이어의 team 하위 배열에 있는 order 값으로 정렬됩니다. 여러 플레이어의 이 값이 동일하면 position으로 추가 정렬됩니다. 결과 배열은 다음과 같습니다:

$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

반환:

평탄화된 배열

이 함수는 키 구분자로 점을 사용하여 다차원 배열을 단일 키-값 배열로 평탄화합니다.

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

$flattened = array_flatten_with_dots($arrayToFlatten);

확인해 보면 $flattened는 다음과 같습니다:

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

사용자는 $id 매개변수를 직접 사용할 수 있지만 필수는 아닙니다. 함수는 내부적으로 이 매개변수를 사용하여 평탄화된 키를 추적합니다. 초기 $id를 제공하면 모든 키 앞에 붙습니다.

// 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에서 불러온 중첩 배열 형태의 데이터를 보여줍니다.

$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). 빈 값을 제외한 결과는 다음과 같습니다:

$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',
                ],
            ],
        ],
    ],
];

그리고 동일한 코드에서 이번에는 빈 값을 포함하는 경우입니다:

$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',
                ],
            ],
        ],
    ],
];