배열 헬퍼
배열 헬퍼는 배열의 복잡한 사용을 단순화하는 여러 함수를 제공합니다. PHP가 이미 제공하는 기능을 중복 구현하지 않으며, 사용 편의성을 크게 향상시키는 경우에만 예외로 합니다.
헬퍼 로드
이 헬퍼는 다음 코드를 사용하여 로드합니다:
helper('array');
사용 가능한 함수
다음 함수들을 사용할 수 있습니다:
- dot_array_search(string $search, array $values)
- 매개변수:
$search (
string) – 배열 검색 방법을 설명하는 점 표기법 문자열$values (
array) – 검색할 배열
- 반환:
배열에서 찾은 값, 또는 null
- 반환 형식:
mixed
이 메서드를 사용하면 점 표기법으로 배열에서 특정 키를 검색할 수 있으며,
*와일드카드 사용도 지원합니다. 다음 배열을 예로 들겠습니다:$data = [ 'foo' => [ 'buzz' => [ 'fizz' => 11, ], 'bar' => [ 'baz' => 23, ], ], ];
검색 문자열
foo.buzz.fizz를 사용하여fizz의 값을 찾을 수 있습니다. 마찬가지로foo.bar.baz로baz의 값을 찾을 수 있습니다:// 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을 반환합니다.
- array_deep_search($key, array $array)
- 매개변수:
$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', ], ], ], ], ];