PHP에는 배열 파괴 (파괴 또는 포장 풀기)의 두 가지 일반적인 방법이 있습니다. List () (또는 Phrase syntax [] )을 사용하여 배열 요소를 한 번에 여러 변수에 할당하고 oreach ()를 사용하여 반복에서 요소를 제거하고 수동으로 해체하십시오. 이 둘의 사용은 교차되지만 원래 설계 의도, 가독성, 성능 및 해당 시나리오는 다릅니다. 다음은 개념, 구문, 가독성, 경계 상황, 성능 및 모범 사례의 비교이며 실용적인 제안 및 코드 예제를 제공합니다. List () / Short Letter [] 의 공식 지침 및 버전 진화는 PHP 매뉴얼을 참조하십시오. PHP +1
List () (및 [] short-write)는 한 번에 독립 변수에 배열의 여러 항목을 "포장"하는 데 사용되며, 알려진 요소 위치 또는 알려진 키 이름에 적합합니다. PHP 7.1이므로 키 이름 기반 해체가 지원됩니다 (예 : [ 'id'=> $ id] = $ arr ). PHP +1
foreach () 는 트래버스 어레이 또는 트래버스 가능한 물체에 사용되는 트래버스 구조물입니다. Deconstruction Syntax를 사용하여 루프 바디 헤드 (예 : foreach (예 : [ 'id'=> $ id, 'name'=> $ name]) ) 또는 루프 내부의 list () / 첨자를 사용하여 단일 요소를 분해 할 수 있습니다. Foreach 의 강도는 임의의 길이 세트를 반복하고 키/값에 액세스하는 것입니다. PHP
<span><span><span class="hljs-variable">$data</span></span><span> = [</span><span><span class="hljs-string">'Alice'</span></span><span>, </span><span><span class="hljs-string">'Bob'</span></span><span>, </span><span><span class="hljs-string">'Carol'</span></span><span>];
</span><span><span class="hljs-keyword">list</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-variable">$c</span></span><span>) = </span><span><span class="hljs-variable">$data</span></span><span>;
</span><span><span class="hljs-comment">// 또는 짧은:</span></span><span>
[</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-variable">$c</span></span><span>] = </span><span><span class="hljs-variable">$data</span></span><span>;
</span></span>
적합 : 알려진 배열 구조, 하나의 할당이 필요한 시나리오 (예 : 함수의 반환 값에서 빠르게 포장을 풀고). 공식 예제 및 지침은 매뉴얼을 참조하십시오. PHP
<span><span><span class="hljs-variable">$row</span></span><span> = [</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">42</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Tom'</span></span><span>];
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-variable">$name</span></span><span>] = </span><span><span class="hljs-variable">$row</span></span><span>;
</span></span>
이것은 수치 지수에 대한 의존성을 피하고 가독성과 견고성을 향상시킵니다. PHP
<span><span><span class="hljs-variable">$rows</span></span><span> = [
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'A'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'B'</span></span><span>],
];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$rows</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> [</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-variable">$name</span></span><span>]) {
</span><span><span class="hljs-comment">// 거래하십시오 $id, $name</span></span><span>
}
</span></span>
가변 길이 세트를 처리 해야하는 경우이 쓰기는 "Traversal"및 "Deconstruction"을 간결한 코드와 결합합니다. 참고 : 다른 PHP 버전/스타일에서는 작성 호환성에주의를 기울여야합니다. PHP 개발 커뮤니티
List () / [] 는 일회성 과 요소가 고정 될 때 매우 명확합니다. 왼쪽의 변수는 한눈에 명확하고 오른쪽의 소스는 명확합니다. 기능 반환 값 포장 풀기 또는 임시 변수 할당에 적합합니다.
Foreach는 다중 요소 세트를 다룰 때 더 자연 스럽습니다. 의미 적으로 "각 요소에 대해 무언가를하십시오". Foreach 헤더에 해체를 쓸 때 논리는 "모든 라인은 레코드이며 필드를 해체하고 처리해야합니다"에 더 가깝습니다. 이것은 또한 가독성을 향상시킵니다. PHP
인덱스 누락 : 숫자 인덱스가 배열에서 위치가 없으면 해당 변수가 NULL 로 설정됩니다 (또는 오류 레벨에 따라 통지를 트리거). 키 이름 파괴를 사용하여 위치 종속성을 피하십시오. PHP +1
참조 할당 : PHP 7.3에서 시작하여 해체는 소스 배열 요소를 직접 수정하거나 복사를 피할 필요가있는 경우 참조 할당 ( & )을 지원합니다. PHP
유형 및 검증 : 두 가지 방법 모두 해체는 자동으로 유형 확인 또는 필수 필드 검증을 수행하지 않습니다. 보안 중요 또는 데이터 소스를 신뢰하지 않으면 키를 명시 적으로 확인하고 값을 확인해야합니다.
단일 고정 요소 포장 풀기의 경우 List () / []는 오버 헤드가 매우 낮고 직접 (일회성 할당)입니다.
Foreach는 반복적으로 설계 되었기 때문에 많은 수의 요소가 하나씩 처리되는 시나리오에 대한 직관적이고 제어 가능한 선택입니다. 루프 내에서 해체를 사용하는 것은 루프 밖에서 수동으로 값을 가져 오는 것보다 용납 할 수없는 속도가 느리지 않습니다. 일반적으로, 이러한 유형의 성능 격차는 대부분의 응용 분야에서 병목 현상이 아닙니다. 선택은 명확성과 의미를 기반으로해야합니다. 특정 시나리오에 대한 엄격한 벤치마킹을 수행하려면 간단한 마이크로 타임 (True) 벤치 마크 또는 벤치 마크 도구를 사용하여 실제 응용 프로그램 데이터에서 소비를 측정 할 수 있습니다. sandbox.ws php
List () / []를 사용합니다 .
함수 또는 배열에서 고정 된 구조를 얻습니다 (예 : [x, y] = getCoordinates () ). 즉시 여러 변수로 포장을 풀어야합니다.
할당 요구 사항은 하나 뿐이며 요소 위치/키 이름은 알려져 있고 안정적입니다.
간결한 해체 할당을 쓰고 싶습니다 (해체 튜플과 마찬가지로).
oreach () (해체를 병합 할 수 있음) :
여러 레코드를 처리하려면 배열 또는 트래버스 가능한 트래버스가 필요합니다.
각 레코드는 여러 단계, 조건부 판단, I/O 또는 데이터베이스 작업을 처리해야하며 반복적 의미가 더 적합합니다.
루프 헤더의 각 항목을 직접 해체하여 가독성을 향상 시키려고합니다 ( Foreach ($ 행으로 [ 'id'=> $ id, 'name'=> $ name]) ).
작업 : 사용자 목록의 ID 와 이름을 꺼내어 문자열을 생성하십시오.
<span><span><span class="hljs-variable">$users</span></span><span> = [
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Alice'</span></span><span>],
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-string">'Bob'</span></span><span>],
];
</span><span><span class="hljs-variable">$result</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$users</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> [</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-variable">$name</span></span><span>]) {
</span><span><span class="hljs-variable">$result</span></span><span>[] = </span><span><span class="hljs-title function_ invoke__">sprintf</span></span><span>(</span><span><span class="hljs-string">'%d: %s'</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);
}
</span></span>
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(function(</span><span><span class="hljs-variable">$u</span></span><span>) {
[</span><span><span class="hljs-string">'id'</span></span><span> => </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-string">'name'</span></span><span> => </span><span><span class="hljs-variable">$name</span></span><span>] = </span><span><span class="hljs-variable">$u</span></span><span>;
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">sprintf</span></span><span>(</span><span><span class="hljs-string">'%d: %s'</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);
}, </span><span><span class="hljs-variable">$users</span></span><span>);
</span></span>
둘 다 읽을 수 있고, 첫 번째는 더 직관적입니다. 두 번째는 더 기능적이지만 예외 처리 및 조기 출구를위한 Foreach 만큼 유연하지 않습니다.
해체 ( list () / [] )는 포장 풀기에 적합합니다 : 간결하고 명확한 의미, 특히 고정 구조의 단일 할당. 공식 매뉴얼 및 마이그레이션 지침에 따르면 PHP 7.1 이후 키 이름 해체 및 간단한 글쓰기가 가능하고 현대적인 글쓰기 방법이 권장되는 것으로 나타났습니다. PHP 7.3은 인용 할당과 같은 기능을 추가합니다. PHP +1
Foreach는 반복 처리에 적합합니다. 수집을 처리하거나 루프 흐름을 제어 할 때 Foreach가 더 적합합니다. 탈퇴는 머리 나 신체에 결합되어 가독성과 지역성을 향상시킬 수 있습니다. PHP
최종 원칙 : 코드를 동료/미래에 가장 이해할 수 있고 강력하게 만드는 솔루션의 우선 순위를 정합니다. [] (또는 list () )를 사용하여 구조 정의 된 데이터에 대해 빨리 포장을 풀고; 가변 길이 또는 프로세스 제어 데이터에는 Foreach를 사용하고 루프에서 해체됩니다.