php에서 array_fill ()은 지정된 값으로 배열을 채우는 매우 편리한 기능입니다. 일반적으로 배열을 초기화하는 데 사용됩니다. 특히 기본 값의 배열을 빠르게 생성 해야하는 경우. 그러나 많은 개발자들은 Array_fill ()을 사용하여 2 차원 배열을 만들 때 일반적인 오해에 빠지기 쉬우므로 프로그램에서 예상치 못한 동작으로 이어집니다. 이 기사는 이러한 일반적인 실수와 올바르게 피하는 방법을 탐구합니다.
질문을 파헤 치기 전에 Array_fill () 의 기본 사용법을 간단히 검토해 봅시다.
$filledArray = array_fill(0, 5, 'default');
// 결과: ['default', 'default', 'default', 'default', 'default']
이 함수는 세 가지 매개 변수를 허용합니다.
인덱스 시작 (색인에서 채우기 시작)
배열 길이 (여러 요소로 채워짐)
값을 채우십시오
Array_Fill ()을 사용하여 5 줄과 같은 2 차원 배열을 만들려고 할 때 각각 3 개의 기본값 '기본값' 이있는 3 차원 배열을 작성하면 많은 개발자가 다음 코드를 작성합니다.
$matrix = array_fill(0, 5, array_fill(0, 3, 'default'));
언뜻보기 에이 글의 글은 합리적으로 보입니다. 출력 결과도 예상대로 다음과 같습니다.
[
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default'],
['default', 'default', 'default']
]
그러나 문제는 다음과 같습니다. 이 서브 어레이는 실제로 동일한 배열에 대한 참조입니다 !
즉, 서브 사업 중 하나의 값을 수정하면 다음과 같습니다.
$matrix[0][0] = 'changed';
이로 인해 모든 행의 첫 번째 값 이 '변경' 됩니다.
[
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default'],
['changed', 'default', 'default']
]
array_fill ()는 한 번에 새 배열 인스턴스를 작성하는 대신 배열 일 때 Array_fill ( )에 동일한 배열에 대한 참조가 채워지기 때문입니다.
이 문제를 해결하려면 각 서브 어레이가 독립적 인 인스턴스인지 확인해야합니다. 가장 안전한 방법은 루프를 사용하는 것입니다.
$matrix = [];
for ($i = 0; $i < 5; $i++) {
$matrix[$i] = array_fill(0, 3, 'default');
}
이렇게하면 각 행의 배열이 새 사본이며 서로 영향을 미치지 않도록합니다.
2 차원 배열을 생성하는 함수를 캡슐화하면 함수 외부에서 서브 배열을 만들지 않도록주의하십시오. 예를 들어:
오류 데모 :
function createMatrix($rows, $cols, $defaultValue) {
$rowTemplate = array_fill(0, $cols, $defaultValue);
return array_fill(0, $rows, $rowTemplate);
}
이 문제는 위에서 설명한 것과 동일하며 모든 줄은 동일한 $ rowtemplate을 나타냅니다. 한 줄을 수정하면 모든 라인에 영향을 미칩니다.
올바른 글쓰기 :
function createMatrix($rows, $cols, $defaultValue) {
$matrix = [];
for ($i = 0; $i < $rows; $i++) {
$matrix[] = array_fill(0, $cols, $defaultValue);
}
return $matrix;
}
온라인으로 블랭크 질문 생성 도구 (예 : https://m66.net/tools/quiz-generator )를 구축한다고 가정하면 각 상자의 기본값이 NULL 인 빈 질문 보드를 작성해야합니다.
$questionBoard = [];
for ($i = 0; $i < 10; $i++) {
$questionBoard[] = array_fill(0, 5, null);
}
이 접근법은 실수로 전체 질문 보드에서 메모리를 공유하지 않아서 사용자 상호 작용 또는 후속 논리에서 버그를 유발할 수 있습니다.
Array_fill () 은 효율적인 도구이지만 중첩 어레이 (2 차원 또는 다차원)와 관련하여 공유 참조 에주의해야합니다. 루프를 사용하고 각 서브 어레이가 새로운 인스턴스인지 확인하면보다 강력하고 예측 가능한 데이터 구조를 구축 할 수 있습니다.
PHP의 가치 및 기준 메커니즘을 이해하면이 문제를 피할 수있을뿐만 아니라 대규모 프로젝트에서 복잡한 배열 구조를 처리하는 능력도 향상됩니다.