PHP를 개발하는 동안 종종 "스파 스 어레이"를 만들어야하는 시나리오를 만나는 경우가 종종 있습니다. 즉, 배열의 특정 특정 인덱스 만 값이 있고 다른 부품에는 비어 있거나 정의되지 않았습니다. PHP에서는 수동 할당으로 드문 어레이를 구현할 수 있지만 일부 개발자는 Array_Fill () 함수를 사용 하여이 프로세스를 단순화하려고 시도했습니다. 그렇다면 array_fill ()가 드문 어레이를 만드는 데 정말 적합합니까? 그 자리에서 분석 해 봅시다.
Array_fill ()은 배열을 신속하게 채우는 기능입니다. 기본 구문은 다음과 같습니다.
array array_fill ( int $start_index , int $count , mixed $value )
$ start_index : 시작 색인.
$ count : 채울 요소의 수.
$ 값 : 각 요소의 값.
예를 들어:
$result = array_fill(5, 3, 'test');
print_r($result);
출력은 다음과 같습니다.
Array
(
[5] => test
[6] => test
[7] => test
)
보시다시피, 인덱스 5에서 시작하는 '테스트' 값으로 3 가지 요소를 채 웁니다.
희소 배열의 핵심 특징은 인덱스 사이에 "구멍"이있을 수 있다는 것입니다. 예를 들어, 배열에서 인덱스 3, 15 및 1000에 값이 필요할 수 있으며 나머지는 비어 있거나 정의되지 않은 상태로 유지됩니다.
희소 배열을 수동으로 구축하는 것과 같습니다.
$data = [];
$data[3] = 'alpha';
$data[15] = 'beta';
$data[1000] = 'gamma';
이 접근법은 매우 직관적이며, PHP의 배열은 본질적으로 주문한 맵 (해시 테이블)이고 정의되지 않은 인덱스가 실제로 메모리를 취하지 않기 때문에 배열 자체는 너무 많은 공간을 차지하지 않습니다.
이론적으로는 Array_Fill ()을 사용하여 특정 연속 드문 세그먼트를 만들 수 있습니다. 예를 들어:
$data = array_fill(1000, 1, 'only_one');
산출:
Array
(
[1000] => only_one
)
이는 높은 비트 인덱스에서 할당을 구현하지만, 여러 가지 불연속 인덱스 값 (예 : 3, 15 및 1000의 동시에 값 설정 등)을 생성하려면 Array_Fill ()을 한 번에 수행 할 수 없습니다. 여러 번 호출해야합니다.
$data = array_fill(3, 1, 'alpha') +
array_fill(15, 1, 'beta') +
array_fill(1000, 1, 'gamma');
이것은 당신이 원하는 희소 배열 구조를 얻을 수 있지만 실제로 "효율적인 배치 생성"의 이점을 잃습니다. 대조적으로, 직접 수동 할당은 더 간결합니다.
$data = [
3 => 'alpha',
15 => 'beta',
1000 => 'gamma'
];
array_fill () 의 장점은 예를 들어 지속적인 초기화입니다.
테이블의 초기 값을 생성합니다.
특정 구조의 통일 초기화 (예 : 0 패딩, 부울 패딩).
초기 오프셋 케이블을 제어하여 시작 위치를 유발합니다.
그러나 "불연속 인덱스"또는 "큰 간격"으로 희소 배열이 필요하다면 가장 적합한 도구가 아닙니다.
Array_fill ()은 연속 인덱스로 배열을 신속하게 초기화하는 데 매우 유용한 기능입니다. 그러나 전형적인 "스파 스 배열"을 구축 할 때는 무력한 것 같습니다. 귀하의 요구가 불연속 스 희소 배열 인 경우 인덱스 할당을 직접 사용하는 방법은 더 유연하고 제어 가능합니다.
물론 스파 스 인덱스 어레이를 빌드하기위한 통합 된 논리가있는 경우 helper 기능을 캡슐화하여 Array_Fill () 구현을 결합 할 수도 있습니다. 예를 들어:
function sparse_fill(array $indexes, $value) {
$result = [];
foreach ($indexes as $index) {
$result[$index] = $value;
}
return $result;
}
$data = sparse_fill([3, 15, 1000], 'example');
이 방법은 대규모 희소 충전 요구에 더 적합하며 유지 관리가 더 쉽습니다.