PHP에서 array_fill () 함수는 일반적으로 배열을 신속하게 채우는 데 사용되며 세 가지 매개 변수, 즉 시작 인덱스, 배열의 길이 및 충전 값을 허용합니다. 참조 유형 데이터로 배열을 채우면 참조 공유 문제가 발생할 수 있습니다. 즉, 배열에서 요소를 수정하면 동일한 참조를 공유하기 때문에 다른 요소의 값에 영향을 줄 수 있습니다.
<?php
// 배열을 정의하십시오
$reference = [];
// 사용 array_fill 배열을 채우십시오
$size = 5;
$reference = array_fill(0, $size, []);
// 배열의 첫 번째 요소를 수정하십시오
$reference[0]['name'] = 'John';
// 배열을 인쇄하십시오
print_r($reference);
?>
위의 코드를 실행하면 채워진 모든 요소가 실제로 동일한 배열 참조를 가리키고 있으므로 $ 참조 [0]을 수정 한 후 다른 모든 요소도 변경됩니다. 이것이 인용 공유 문제의 근본 원인입니다.
Array_Fill () 이 배열을 채우는 경우 참조 공유 문제를 피하기 위해 각 배열 요소에 독립적 인 사본이 있는지 확인하는 데 사용할 수있는 몇 가지 기술이 있습니다.
일반적인 솔루션은 익명 함수와 함께 Array_Map ()을 사용하여 각 요소에 대한 새 배열 사본을 작성하는 것입니다. 이것은 참조 공유 문제를 피합니다.
<?php
// 배열의 크기를 정의하십시오
$size = 5;
// 사용 array_map 배열을 채우십시오,각 요소에 대한 새 배열 사본을 만듭니다
$reference = array_map(function() {
return []; // 새 빈 배열을 반환하십시오
}, array_fill(0, $size, null));
// 배열의 첫 번째 요소를 수정하십시오
$reference[0]['name'] = 'John';
// 배열을 인쇄하십시오
print_r($reference);
?>
이 메소드는 array_map ()을 통해 각 배열 요소에 대한 새 배열을 생성하므로 참조 공유 문제를 피합니다.
또 다른 방법은 배열을 수동으로 채워서 참조 공유 문제를 피하는 것입니다. 이 메소드는 array_fill () 에 의존하지 않지만 배열을 하나씩 채우기 위해 Foreach 또는 for Loop을 사용합니다.
<?php
// 배열의 크기를 정의하십시오
$size = 5;
// 手动배열을 채우십시오
$reference = [];
for ($i = 0; $i < $size; $i++) {
$reference[] = []; // 매번 새 빈 배열을 추가하십시오
}
// 배열의 첫 번째 요소를 수정하십시오
$reference[0]['name'] = 'John';
// 배열을 인쇄하십시오
print_r($reference);
?>
이 접근법의 장점은 참조 공유 문제를 일으키지 않고 매번 새로운 배열 인스턴스가 생성된다는 것입니다.
PHP에서, 배열을 채우기 위해 array_fill ()을 사용하는 경우, 채워진 값이 참조 유형 인 경우 배열 요소간에 동일한 참조가 공유되어 예기치 않은 수정 문제가 발생할 수 있습니다. 이 문제를 피하기 위해 Array_Map ()을 사용하거나 배열을 수동으로 채우려면 각 요소가 별도의 사본인지 확인할 수 있습니다.
이러한 방법을 사용하면 참조 공유 문제에 대해 걱정하지 않고 배열 패딩을보다 안전하게 사용할 수 있습니다.