현재 위치: > 최신 기사 목록> array_fill ()을 사용하여 2D 배열을 생성 할 때 일반적인 오류

array_fill ()을 사용하여 2D 배열을 생성 할 때 일반적인 오류

M66 2025-06-05

php에서 array_fill ()은 지정된 값으로 배열을 채우는 매우 편리한 기능입니다. 일반적으로 배열을 초기화하는 데 사용됩니다. 특히 기본 값의 배열을 빠르게 생성 해야하는 경우. 그러나 많은 개발자들은 Array_fill ()을 사용하여 2 차원 배열을 만들 때 일반적인 오해에 빠지기 쉬우므로 프로그램에서 예상치 못한 동작으로 이어집니다. 이 기사는 이러한 일반적인 실수와 올바르게 피하는 방법을 탐구합니다.

1. array_fill () 의 기본 사용

질문을 파헤 치기 전에 Array_fill () 의 기본 사용법을 간단히 검토해 봅시다.

 $filledArray = array_fill(0, 5, 'default');
// 결과: ['default', 'default', 'default', 'default', 'default']

이 함수는 세 가지 매개 변수를 허용합니다.

  1. 인덱스 시작 (색인에서 채우기 시작)

  2. 배열 길이 (여러 요소로 채워짐)

  3. 값을 채우십시오

2. 공통 오류 : 동일한 배열 인스턴스를 참조합니다

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 ( )에 동일한 배열에 대한 참조가 채워지기 때문입니다.

3. 올바른 방법 : 고유 한 서브 어레이를 구성하려면 루프를 사용하십시오.

이 문제를 해결하려면 각 서브 어레이가 독립적 인 인스턴스인지 확인해야합니다. 가장 안전한 방법은 루프를 사용하는 것입니다.

 $matrix = [];
for ($i = 0; $i < 5; $i++) {
    $matrix[$i] = array_fill(0, 3, 'default');
}

이렇게하면 각 행의 배열이 새 사본이며 서로 영향을 미치지 않도록합니다.

4. 함수 캡슐화에서 공유 참조를 피하기 위해주의하십시오.

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;
}

5. 실제 응용 프로그램의 예

온라인으로 블랭크 질문 생성 도구 (예 : https://m66.net/tools/quiz-generator )를 구축한다고 가정하면 각 상자의 기본값이 NULL 인 빈 질문 보드를 작성해야합니다.

 $questionBoard = [];
for ($i = 0; $i < 10; $i++) {
    $questionBoard[] = array_fill(0, 5, null);
}

이 접근법은 실수로 전체 질문 보드에서 메모리를 공유하지 않아서 사용자 상호 작용 또는 후속 논리에서 버그를 유발할 수 있습니다.

6. 결론

Array_fill () 은 효율적인 도구이지만 중첩 어레이 (2 차원 또는 다차원)와 관련하여 공유 참조 에주의해야합니다. 루프를 사용하고 각 서브 어레이가 새로운 인스턴스인지 확인하면보다 강력하고 예측 가능한 데이터 구조를 구축 할 수 있습니다.

PHP의 가치 및 기준 메커니즘을 이해하면이 문제를 피할 수있을뿐만 아니라 대규모 프로젝트에서 복잡한 배열 구조를 처리하는 능력도 향상됩니다.