웅변적인 컬렉션: 각각 vs.
언플러그드 컬렉션에 대한 질문은 아닐 수도 있지만, 그들과 작업하는 동안 저에게 딱 들어맞았습니다.그냥 우리가 가지고 있다고 가정해 봅시다.$collection
의 Illuminate\Support\Collection
.
만약 우리가 그것을 반복하고 싶다면, 사용의 장단점은 무엇입니까?each()
대 문을닫규사칙사람인적과람는▁a▁a▁with람▁versus사.foreach
니까습있?
foreach ($collection as $item) {
// Some code
}
대
$collection->each(function ($item) {
// Some code
});
A foreach
문은 컬렉션을 순환하고 그에 대한 일종의 논리를 수행하는 일종의 방법으로 사용되어야 합니다.프로그램의 다른 내용에 영향을 미치는 경우 이 루프를 사용합니다.
그.each
는 메드사용을 합니다.array_map
컬렉션의 각 개체를 순환하고 각 개체에 대해 닫기를 수행합니다.그런 다음 결과 배열을 반환합니다.그게 열쇠야!.each
컬렉션을 어떤 식으로든 변경하려는 경우 사용해야 합니다.자동차 배열일 수도 있고 모델을 대문자 또는 소문자로 만들고 싶을 수도 있습니다.당신은 그냥 폐쇄를 전달할 것입니다..each
객체를 가져가서 호출하는 방법strtoupper()
각 Car 객체의 모델에서.그런 다음 변경 내용이 포함된 컬렉션을 반환합니다.
이야기의 사기는 다음과 같습니다..each
각 식으로든 ; 배의각항어식변든방법는경; 사용열하를 합니다.foreach
루프 - 각 개체를 사용하여 프로그램의 다른 부분에 영향을 줍니다(일부 논리 문 사용).
업데이트(2015년 6월 7일)
아래에 그렇게 웅변적으로 (내가 거기서 무엇을 했는지 보세요?) 위의 대답은 약간 틀렸습니다..each
을 한 방법array_map
을 실제로 사용한 적은 없습니다.array_map
합다니가 배열. 그래서, 에 의해 만들어진 새로운 배열.array_map
되지 않습니다.Collection
그것을 바꾸려면, 당신은 그것을 사용하는 것이 더 낫습니다..map
방법, 이에또한존다니재합은것에도 합니다.Collection
물건.
사용foreach
이 조금 더 의미가 이은 반드시 각항에대조더금있의다습을 수 때문입니다. 왜냐하면 사용자가 확실하게 사용하지 않는 한 마감 외부의 변수에 액세스할 수 없기 때문입니다.use
내가 보기엔 어색한 진술.
위의 답변이 처음 작성되었을 때의 구현은 여기에서 확인할 수 있습니다.
.each
5. 버전 5.1 버전
더.each
그들이 아래에 대해 이야기하고 있는 것은 더 이상 사용하지 않습니다.array_map
의 각 항목을 을 컬션의각반복고전하호항달다출목니합을된항렉라고 부릅니다.$callback
배열에서 항목과 해당 키를 전달합니다.기능적으로는 동일하게 작동하는 것 같습니다.사용할 것으로 생각합니다.foreach
코드를 읽을 때 루프가 더 말이 됩니다.하지만, 사용함으로써 얻을 수 있는 이점은.each
왜냐하면 그것은 당신의 마음을 자극한다면 당신이 방법들을 함께 묶을 수 있게 해주기 때문입니다.또한 비즈니스 논리가 필요할 경우 콜백에서 거짓을 반환하여 루프를 조기에 종료할 수 있습니다.
새로운 구현에 대한 자세한 내용은 소스 코드를 참조하십시오.
기존 답변에 혼란스러운 오보가 많습니다.
단답형
간단한 대답은 다음과 같습니다.Laravel 컬렉션에서 를 사용하여 를 반복하는 것은 큰 차이가 없습니다.두 기술 모두 동일한 결과를 달성합니다.
항목을 수정하는 것은 어떻습니까?
여부와 무관합니다..each()
대 대foreach
이 두 가지 기능을 모두 사용하면 어떤 유형의 항목에 대해 설명하는지에 따라 컬렉션의 항목을 수정할 수 있습니다.
- 컬렉션에 개체가 포함된 경우 항목 수정:컬렉션이 PHP 객체의 집합(예: 웅변 컬렉션)인 경우 다음 중 하나를 수행합니다.
.each()
또는foreach
할 수 예:$item->name = 'foo'
그것은 단순히 PHP 객체가 항상 참조처럼 행동하기 때문입니다.전체 개체를 다른 개체로 바꾸려는 경우(일반적이지 않은 시나리오),.map()
대신. - 컬렉션에 비개체가 포함된 경우 항목 수정:이것은 덜 일반적이지만 컬렉션에 문자열과 같은 비개체가 포함된 경우,
.each()
에는컬렉항목값을수수다없니습 ((폐쇄의 반환 값은 무시됩니다.) 사용.map()
대신.
그럼... 어떤 걸 써야 할까요?
성능에 대해 궁금하실 경우를 대비해서, 저는 웅변 아이템과 스트링 컬렉션 모두의 많은 컬렉션으로 몇 가지 테스트를 했습니다. 모두 두경우모, 용사를 합니다.foreach
더빨니다습보다 빨랐습니다..each()
하지만 우리는 마이크로초에 대해 이야기하고 있습니다.대부분의 실제 시나리오에서는 데이터베이스 등에 액세스하는 데 걸리는 시간에 비해 속도 차이가 크지 않습니다.
그것은 대부분 당신의 개인적인 취향에 따라 결정됩니다.용사를 합니다..each()
할 수 에 좋습니다(예: 여작 함연수예있때좋문습니다에기할결께을업러예(좋▁is)..where(...).each(...)
). 각 상황에서 둘 다 제 저는 각각의 상황에서 가장 깨끗해 보이는 것에 따라 둘 다 제 코드로 사용하는 경향이 있습니다.
다른 두 대답과는 반대로Collection::each()
엄밀히 말하면 컬렉션의 항목 값은 변경되지 않습니다.를 사용합니다.array_map()
하지만 통화 결과는 저장되지 않습니다
컬렉션의 각 항목을 수정하려면(예: 현재 승인된 답변에 대한 설명에서 Damon으로 객체에 캐스팅) 다음을 사용해야 합니다.Collection::map()
이게하기통화결따에새만라컬다니에 대한 새 .array_map()
.
더: 후를사는것더유다니익합이용하자▁it▁the다.each()
.
조건을 연결하고 보다 명확한 표현 코드를 작성할 수 있습니다(예:
$example->each()->map()->filter();
이렇게 하면 컴퓨터에 수행 방법 대신 수행할 작업을 지시하는 선언적 프로그래밍에 더 가까워집니다.
유용한 기사:
https://martinfowler.com/articles/collection-pipeline/
https://adamwathan.me/refactoring-to-collections/
->each()
와 동일합니다.foreach(...)
더 나쁜 것은.
여기서 주요 차이점은 가변 범위입니다.고전적으로 foreach
은 에선언변쉽수조있다습니 할 수 .foreach
마감을 처리하는 경우 상위 범위에서 변수를 상속해야 합니다.use
이 기능을 사용하면 범위에 따라 기능이 달라지기 때문에 혼란스럽습니다.
체인으로 연결할 수 .->each()
다른 기능과 함께 하지만 컬렉션의 값을 변경하지 않기 때문에 사용 사례가 매우 제한적입니다.그리고 그것은 "사용하기 드문" 것이기 때문에 개발자들이 당신의 코드를 읽을 때 항상 쉽게 인식할 수 있는 것은 아닙니다.
많은 사람들이 당신의 암호를 읽을 수 없을 것이고, 읽을 사람들을 소중히 여길 것입니다.
참조로 배열을 전달하지 않는 한 각() 구문에서는 반복되는 배열 항목의 값을 변경할 수 없습니다.
foreach ($array as &$value) $value *= $value;
각() 웅변 메서드는 PHP array_map() 함수를 래핑하므로 이를 허용합니다.
앞의 답변과 같이 다른 동기가 있을 경우 각()에 사용해야 합니다.이는 각()의 성능이 array_map()보다 훨씬 좋기 때문입니다.
http://willem.stuursma.name/2010/11/22/a-detailed-look-into-array_map-and-foreach/
언급URL : https://stackoverflow.com/questions/18592836/eloquent-collections-each-vs-foreach
'programing' 카테고리의 다른 글
도커 - 이름이 이미 컨테이너에서 사용되고 있습니다. (0) | 2023.08.09 |
---|---|
Socket.io 을 Spring-boot와 함께 사용할 수 있습니까? (0) | 2023.08.09 |
SQL Server Management Studio [Schema and data]를 사용하여 테이블을 다시 만드는 스크립트를 생성하는 방법은 무엇입니까? (0) | 2023.08.09 |
자바스크립트로 길게 누르기? (0) | 2023.08.09 |
sqlalchemy 및 pyodbc를 사용하여 SQL Server 2012에 연결 (0) | 2023.08.09 |