Iterator 도구(간단히 itertools 는 배열, 반복자 및 문자열과 같은 데이터 시퀀스를 처리하는 편리한 도구 모음입니다. 일부 이름 지정 및 API는 Python itertools 기반으로 합니다.
예
일반적인 작업은 다음과 같습니다.
map
및 mapBy
filter
, difference
sorted
groupBy
accumulate
, collapse
및 reduce
Twig를 통해 사용 가능한 itertools 필터/함수를 사용하려면 config/services.yaml
에 이 서비스 정의를 추가하기만 하면 됩니다.
Zicht itertools twigExtension :
tags : ['twig.extension']
composer test
composer lint
아래 예제에서는 다음 데이터를 사용하여 다양한 Iterator 도구가 작동하는 방식을 보여줍니다.
$ words = [ ' Useful ' , ' Goonies ' , ' oven ' , ' Bland ' , ' notorious ' ];
$ numbers = [ 1 , 3 , 2 , 5 , 4 ];
$ vehicles = [
[
' id ' => 1 ,
' type ' => ' car ' ,
' wheels ' => 4 ,
' colors ' => [ ' red ' , ' green ' , ' blue ' ],
' is_cool ' => false ,
' price ' => 20000 ,
],
[
' id ' => 2 ,
' type ' => ' bike ' ,
' wheels ' => 2 ,
' colors ' => [ ' red ' , ' green ' , ' blue ' ],
' is_cool ' => false ,
' price ' => 600 ,
],
[
' id ' => 5 ,
' type ' => ' unicicle ' ,
' wheels ' => 1 ,
' colors ' => [ ' red ' ],
' is_cool ' => true ,
' price ' => 150 ,
],
[
' id ' => 9 ,
' type ' => ' car ' ,
' wheels ' => 8 ,
' colors ' => [ ' blue ' ],
' is_cool ' => true ,
' price ' => 100000 ,
],
];
위의 예제 데이터를 사용하여 itertools 사용하여 자동차의 모든 고유 색상을 알파벳 순서로 얻는 방법은 다음과 같습니다.
use Zicht itertools util Filters ;
use function Zicht itertools iterable ;
$ vehicles = iterable ( $ vehicles )
-> filter (Filters:: equals ( ' car ' , ' type ' )) // {[vehicle...], [vehicle...]}
-> map ( ' colors ' ) // {0: ['red', 'green', 'blue'], 1: ['blue']}
-> collapse () // {0: 'red', 1: 'green', 2: 'blue', 3: 'blue'}
-> unique () // {0: 'red', 1: 'green', 2: 'blue'}
-> sorted (); // {2: 'blue', 1: 'green', 0: 'red'}
Twig에서도 동일한 결과를 얻을 수 있습니다.
{% for vehicle_color in vehicles
|it. filter ( it . filters . equals ( ' car ' , ' type ' ))
|it. map ( ' colors ' )
|it. collapse
|it. unique
|it. sorted
%}
{{ vehicle_color }}
{% endfor %}
많은 itertools $strategy
매개변수가 전달될 수 있습니다. 이 매개변수는 컬렉션의 요소에서 값을 가져오는 데 사용됩니다. $strategy
다음 세 가지 중 하나일 수 있습니다.
null인 경우 요소 자체가 반환됩니다. 예를 들어:
use function Zicht itertools iterable ;
$ result = iterable ( $ words )-> map ( null );
var_dump ( $ result );
// {0: 'Useful', 1: 'Goonies', 2: 'oven', 3: 'Bland', 4: 'notorious'}
또는 나뭇가지에서:
{{ dump ( word |it. map ) }}
클로저. 이 경우 클로저는 반환 값을 계산하는 데 사용할 매개변수로 요소 값과 키를 사용하여 호출됩니다. 예를 들어:
use function Zicht itertools iterable ;
$ getDouble = fn ( $ value , $ key ) => 2 * $ value ;
$ result = iterable ( $ numbers )-> map ( $ getDouble );
var_dump ( $ result );
// {0: 2, 1: 6, 2: 4, 3: 10, 4: 8}
또는 나뭇가지에서:
{{ dump ( numbers |it. map ( num => 2 * num )) }}
문자열. 이 경우 이 문자열은 공용 속성, 메서드 또는 배열 인덱스를 찾으려고 시도하는 클로저를 만드는 데 사용됩니다. 예를 들어:
use function Zicht itertools iterable ;
$ result = iterable ( $ vehicles )-> map ( ' type ' );
var_dump ( $ result );
// {0: 'car', 1: 'bike', 2: 'unicicle', 3: 'car'}
또는 나뭇가지에서:
{{ dump ( word |it. map ) }}
문자열은 점으로 구분된 여러 단어로 구성될 수 있으므로 중첩된 속성, 메서드 및 배열 인덱스에 액세스할 수 있습니다.
문자열의 단어 중 하나를 기존 속성, 메서드 또는 배열 인덱스로 확인할 수 없는 경우 null
값이 반환됩니다. 예를 들어:
use function Zicht itertools iterable ;
$ result = iterable ( $ vehicles )-> map ( ' colors.2 ' );
var_dump ( $ result );
// {0: 'blue', 1: 'blue', 2: null, 3: null}
또는 나뭇가지에서:
{{ dump ( vehicles |it. map ( ' colors.2 ' )) }}
Iterator 도구를 사용하는 한 가지 방법은 배열, Iterator, 문자열 등을 IterableIterator
로 변환하는 것입니다. 이 클래스는 모든 일반적인 작업에 대한 원활한 인터페이스를 제공합니다. 예를 들어:
use function Zicht itertools iterable ;
$ result = iterable ( $ vehicles )-> filter ( ' is_cool ' )-> mapBy ( ' id ' )-> map ( ' type ' );
var_dump ( $ result );
// {5: 'unicicle', 9: 'car'}
또는 나뭇가지에서:
{{ dump ( vehicles |it. filter ( ' is_cool ' ).mapBy( ' id ' ).map( ' type ' )) }}
매핑은 하나의 컬렉션을 동일한 길이의 다른 컬렉션으로 변환합니다. map
사용하면 요소를 조작할 수 있고 mapBy
사용하면 컬렉션 키를 조작할 수 있습니다.
예를 들어 클로저를 사용하여 $vehicles
의 각 요소에 대한 제목을 만들 수 있습니다.
use function Zicht itertools iterable ;
$ getTitle = fn ( $ value , $ key ) => sprintf ( ' %s with %s wheels ' , $ value [ ' type ' ], $ value [ ' wheels ' ]);
$ titles = iterable ( $ vehicles )-> map ( $ getTitle );
var_dump ( $ titles );
// {0: 'car with 4 wheels', ..., 3: 'car with 8 wheels'}
문자열 getter 전략을 사용하면 차량 식별자로 매핑된 $vehicles
의 각 요소에 대한 유형을 쉽게 얻을 수 있습니다. 예를 들어:
use function Zicht itertools iterable ;
$ types = iterable ( $ vehicles )-> mapBy ( ' id ' )-> map ( ' type ' );
var_dump ( $ types );
// {1: 'car', 2: 'bike', 5: 'unicicle', 9: 'car'}
또는 나뭇가지에서:
{{ dump ( vehicles |it. mapBy ( ' id ' ).map( ' type ' )) }}
mappings.php에는 몇 가지 일반적인 매핑 클로저를 사용할 수 있습니다. 이러한 함수를 호출하면 map
및 mapBy
에 전달할 수 있는 클로저가 반환됩니다. 예를 들어:
use Zicht itertools util Mappings ;
use function Zicht itertools iterable ;
$ lengths = iterable ( $ words )-> map (Mappings:: length ());
var_dump ( $ lengths );
// {0: 6, 1: 3, 2: 4, 3: 5, 4: 9}
또는 나뭇가지에서:
{{ dump ( words |it. map ( it . mappings . length )) }}
필터링은 하나의 컬렉션을 더 짧은 다른 컬렉션으로 변환합니다. filter
사용하면 컬렉션의 각 요소가 평가되고, empty
것으로 간주되는 요소는 거부되고, empty
있지 않은 요소는 필터를 통과할 수 있습니다.
예를 들어 클로저를 사용하여 요소가 비싼지 확인할 수 있으며 filter
다음을 통해 비싼 요소만 허용합니다.
use function Zicht itertools iterable ;
$ isExpensive = fn ( $ value , $ key ) => $ value [ ' price ' ] >= 10000 ;
$ expensiveTypes = iterable ( $ vehicles )-> filter ( $ isExpensive )-> map ( ' type ' );
var_dump ( $ expensiveTypes );
// {1: 'car', 9: 'car'}
또는 나뭇가지에서:
{{ dump ( vehicles |it. filter ( vehicle => vehicle . price >= 10000 ).map( ' type ' )) }}
문자열 getter 전략을 사용하면 멋지다고 생각되는 $vehicles
만 얻을 수 있습니다. 예를 들어:
use function Zicht itertools iterable ;
$ coolVehicleTypes = iterable ( $ vehicles )-> filter ( ' is_cool ' )-> map ( ' type ' );
var_dump ( $ coolVehicleTypes );
// {5: 'unicicle', 9: 'car'}
또는 나뭇가지에서:
{{ dump ( vehicles |it. filter ( ' is_cool ' ).map( ' type ' )) }}
filter.php에는 몇 가지 일반적인 필터 클로저를 사용할 수 있습니다. 이 함수를 호출하면 filter
에 전달할 수 있는 클로저가 반환됩니다. 예를 들어:
use Zicht itertools util Filters ;
use function Zicht itertools iterable ;
$ movieWords = iterable ( $ words )-> filter (Filters:: in ([ ' Shining ' , ' My little pony ' , ' Goonies ' ]));
var_dump ( $ movieWords );
// {1: 'Goonies'}
또는 나뭇가지에서:
{{ dump ( words |it. filter ( it . filters . in ([ ' Shining ' , " My little pony', 'Goonies'])) }}
sorted
하나의 컬렉션을 동일한 크기의 다른 컬렉션으로 변환하지만 요소는 재정렬될 수 있습니다.
예를 들어 기본값인 null
getter 전략을 사용하면 요소 값을 오름차순으로 정렬합니다.
use function Zicht itertools iterable ;
$ ordered = iterable ( $ numbers )-> sorted ();
var_dump ( $ ordered );
// {0: 1, 2: 2, 1: 3, 4: 4, 3: 5}
또는 나뭇가지에서:
{{ dump ( numbers |it. sorted }}
정렬 알고리즘은 키를 보존하며 안정성이 보장됩니다. 즉, 동일한 값을 사용하여 요소를 정렬하면 정렬 순서가 입력 요소의 순서와 동일하다는 것이 보장됩니다. 이는 표준 PHP 정렬 기능과 반대됩니다.
클로저 게터 전략을 사용하면 반환된 값이 순서를 결정하는 데 사용됩니다. 클로저는 요소당 정확히 한 번씩 호출되며 결과 값은 비교할 수 있어야 합니다. 예를 들어:
use function Zicht itertools iterable ;
$ getLower = fn ( $ value , $ key ) => strtolower ( $ value );
$ ordered = iterable ( $ words )-> sorted ( $ getLower );
var_dump ( $ ordered );
// {3: 'Bland', 1: 'Goonies', 2: 'oven', 0: 'Useful', 4: 'notorious'};
mappings.php는 난수를 반환하는 매핑 클로저를 제공합니다. 컬렉션을 무작위 순서로 정렬하는 데 사용할 수 있습니다. 예를 들어:
use Zicht itertools util Mappings ;
use function Zicht itertools iterable ;
$ randomized = iterable ( $ words )-> sorted (Mappings:: random ());
var_dump ( $ randomized );
// {... randomly ordere words ...}
또는 나뭇가지에서:
{{ dump ( words |it. sorted ( it . mappings . random )) }}
groupBy
하나의 컬렉션을 특정 기준에 따라 요소를 그룹화하는 하나 이상의 컬렉션으로 변환합니다.
예를 들어, 문자열 getter 전략을 사용하면 동일한 유형의 모든 $vehicles
그룹화할 수 있습니다.
use function Zicht itertools iterable ;
$ vehiclesByType = iterable ( $ vehicles )-> groupBy ( ' type ' );
var_dump ( $ vehiclesByType );
// {'bike': {1: [...]}, 'car': {0: [...], 3: [...]} 'unicicle': {2: [...]}}
또는 나뭇가지에서:
{{ dump ( vehicles |it. groupBy ( ' type ' )) }}
차량의 원래 키가 여전히 결과 그룹의 일부인 것은 아니며 각 그룹 내의 요소는 입력의 순서를 유지합니다. 즉, sorted
에서 제공하는 안정적인 정렬을 사용합니다.
reduce
왼쪽에서 오른쪽으로 컬렉션의 요소에 대해 누적적으로 두 인수의 클로저를 호출하여 컬렉션을 단일 값으로 변환합니다.
예를 들어 인수가 없으면 reduce
컬렉션의 모든 요소를 함께 추가합니다.
use function Zicht itertools iterable ;
$ sum = iterable ( $ numbers )-> reduce ();
var_dump ( $ sum );
// 15
또는 나뭇가지에서:
{{ dump ( numbers |it. reduce ) }}
위의 예에서 사용된 기본 클로저는 다음과 같습니다:
public static function add ( $ a , $ b ): Closure
{
return $ a + $ b ;
}
$numbers
{1, 3, 2, 5, 4} 요소로 구성되어 있으면 add
클로저가 4번 호출됩니다.
$ sum = Reductions:: add (Reductions:: add (Reductions:: add (Reductions:: add (( 1 , 3 ), 2 ), 5 ), 4 ));
var_dump ( $ sum );
// 15
Reductions.php에는 몇 가지 일반적인 축소 클로저가 있습니다. 이러한 함수를 호출하면 reduction
로 전달될 수 있는 클로저가 반환됩니다. 예를 들어:
use Zicht itertools util Reductions ;
use function Zicht itertools iterable ;
$ scentence = iterable ( $ words )-> reduce (Reductions:: join ( ' - ' ));
var_dump ( $ scentence );
// 'Useful - Goonies - oven - Bland - notorious'
또는 나뭇가지에서:
{{ dump ( words |it. reduce ( it . reductions . join ( ' - ' )) }}
또 다른 일반적인 감소는 여러 목록을 하나의 목록으로 연결하는 것입니다. 우리는 이 과정을 붕괴라고 부릅니다. 이 프로세스는 reduce
및 chain
함께 사용하여 수행할 수도 있습니다. 그러나 자주 사용되기 때문에 collapse
도우미를 사용하면 사용법이 더 쉬워집니다. 예:
use function Zicht itertools iterable ;
$ flat = iterable ([[ ' one ' , ' two ' ], [ ' three ' ]])-> collapse ();
var_dump ( $ flat );
// {0: 'one', 1: 'two', 0: 'three'}
또는 나뭇가지에서:
{% set data = [[ ' one ' , ' two ' ], [ ' three ' ]] %}
{{ dump ( data |it. collapse ) }}