코어 포인트
반복은 프로그래밍에서 값 목록을 가로 지르는 일반적인 과정입니다. PHP에서 반복자는 배열, 디렉토리 목록 또는 데이터베이스 결과 세트와 같은 목록을 통과하는 객체입니다.
표준 PHP 라이브러리 (SPL)는 코드를보다 효율적이고 읽기 쉬운 많은 반복기를 제공합니다. SPL 반복기를 사용하는 것은 특히 간단한 배열 이외의 많은 양의 데이터 또는 복잡한 구조를 처리 할 때 유리합니다.
Arrayiterator 및 RecursiveArrayiterator는 배열을 반복하는 데 사용되는 두 개의 SPL ITERATOR입니다. Arrayiterator는 1 차원 어레이에 사용되며 재귀 층류는 다차원 배열에 사용됩니다. -
DirectoryIterator 및 RecursivedirectoryIterator는 디렉토리 목록을 가로 지르는 데 사용되는 SPL ITERATOR입니다. DirectoryItertor는 디렉토리를 반복하는 데 사용될 수 있으며, 재귀 강사는 디렉토리를 재귀 적으로 통과하는 데 사용됩니다.
-
나는 처음 "반복"이라는 용어와 접촉했을 때 약간 압도 당하고 SPL에서 관련된 수많은 범주를 보았습니다. 반복은 이해하기에는 너무 복잡해 보입니다. 그러나 나는 그것이 우리가 프로그래머들이하고있는 화려한 운영 성명서라는 것을 곧 깨달았습니다. PHP를 사용하는 경우 어레이를 사용했을 것입니다. 배열을 사용했다면 요소를 반복했습니다. 모든 코드를 살펴보면 거의
루프를 찾을 수 있습니다. 예, 반복은 값 목록을 가로 지르는 과정 일뿐입니다. 반복자는 배열, 디렉토리 목록 또는 데이터베이스 결과 세트가 될 수있는 목록을 가로 지르는 객체입니다. 이 시리즈의 첫 번째 부분에서는 반복과 표준 PHP 라이브러리 (SPL)의 내장 클래스를 활용하는 방법을 소개합니다. SPL에는 많은 수의 반복자가 포함되어 있으며 코드에서이를 사용하여 코드 효율성을 향상시킬 수 있으며 대부분의 경우 코드를보다 읽기 쉽게 만듭니다. -
spl iterator를 언제 그리고 왜 사용 해야하는지 -
알다시피, 반복적 인 반복 객체는 기본적으로 반복 배열과 동일하므로 많은 사람들이 처음에 배열을 고수하기가 더 쉬운 지 알고 싶어합니다. 그러나 반복자의 실질적인 장점은 간단한 배열보다 많은 양의 데이터 또는 더 복잡한 데이터를 가로 지르는 것입니다.
루프는 배열이 전달 된 모든 배열을 복사합니다. 많은 양의 데이터를 작업하는 경우 루프에 큰 배열을 사용할 때마다 데이터를 복사 할 수 있습니다. SPL Ierator는 목록을 캡슐화하고 한 번에 하나의 요소 만 가시성을 노출시켜보다 효율적입니다. 반복자는 데이터 제공 업체를 생성 할 때 데이터 제공을 지연시킬 수 있으므로 좋은 구성입니다. 여기에서 게으른로드는 필요한 경우 필요한 데이터 만 검색합니다. 사용자가 사용할 수 있도록 처리중인 데이터를 조작 (필터, 변환 등) 할 수도 있습니다. 그러나 반복자 사용 결정은 항상 귀하의 재량에 달려 있습니다. 반복자에는 많은 이점이 있지만 경우에 따라 (예 : 더 작은 배열 세트) 불필요한 오버 헤드로 이어질 수 있습니다. 그것들을 사용하는 시점은 당신의 스타일 선택이며 특정 상황에서의 적용 가능성은 당신이 고려해야 할 요소입니다.
반복 배열 foreach
내가 소개하고 싶은 첫 번째 반복자는 Arrayiterator입니다. 생성자는 어레이를 인수로 취하고이를 통과하는 데 사용할 수있는 메소드를 제공합니다. 예는 다음과 같습니다.
위의 코드의 출력은 다음과 같습니다
일반적으로 Arrayiterator를 직접 사용하는 대신 ArrayObject (특정 컨텍스트에서 객체를 배열로 처리 할 수있는 클래스)를 사용합니다. A 루프를 사용하거나 arrayiterator :: getIterator ()를 직접 사용하면 자동으로 배열 테이터가 생성됩니다. ArrayoBject 및 Arrayiterator는 이러한 맥락에서 배열처럼 행동하지만 및 <code class="language-php"><?php
// 一个数组(使用PHP 5.4的新简写法)
$arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource",
"designfestival", "cloudspring"];
// 创建一个新的ArrayIterator并传入数组
$iter = new ArrayIterator($arr);
// 遍历对象
foreach ($iter as $key => $value) {
echo $key . ": " . $value . "<br>";
}</code>
와 같은 내장 배열 기능을 사용하려는 객체입니다. Arrayiterator는 사용하기 간단하지만 1 차원 배열의 경우에만 사용됩니다. 때로는 다차원 배열이 있고 중첩 배열을 통해 재귀 적으로 반복하고 싶습니다. 이 경우 recursivearrayiterator를 사용할 수 있습니다. 일반적인 시나리오는 루프를 중첩하거나 재귀 함수를 생성하여 다차원 배열에서 모든 항목을 확인하는 것입니다. 예를 들면 :
<code>0: sitepoint
1: phpmaster
2: buildmobile
3: rubysource
4: designfestival
5: cloudspring</code>
위의 코드의 출력은 다음과 같습니다
더 우아한 방법은 recursivearrayiterator : 를 사용하는 것입니다
foreach
출력은 이전 예제와 동일합니다. 여기에서 재귀 인 인스턴스를 생성하고 재귀 릴레이 테이터 객체로 전달해야합니다. 그렇지 않으면 루트 배열에서만 값을 가져옵니다 (및 설정을 기반으로 생성 된 많은 알림). 다차원 배열로 작업 할 때는 현재 항목을 통해 반복 할 수 있으므로 재귀 르 레이 테이터를 사용해야하지만 직접 수행하는 데 달려 있습니다. RECURUSIVEITERATORITERITERATOR는이 작업을 수행하는 데코레이터입니다. 그것은 재귀 earrayiterator를 필요로하고, 그것을 반복하고, 찾은 반복 가능한 항목을 반복합니다 (등). 본질적으로, 그것은 재귀 르 레이어 테이터를 "아파트"합니다. recursiveiteratoriterator :: getDepth ()를 호출하여 추적을 위해 현재 반복의 깊이를 얻을 수 있습니다. 그러나 객체를 반환하려면 recursivearrayiterator 및 recursiveiteratoriterator를 사용해야합니다. sort()
반복 디렉토리 목록 array_keys()
의심 할 여지없이 디렉토리와 해당 파일을 어느 시점에서 반복해야하며 PHP (예 : 또는 )가 제공하는 내장 기능을 사용하여이를 수행 할 수 있지만 DirectoryIterator를 사용할 수도 있습니다. 가장 간단한 형태로 DirectoryIterator는 매우 강력하지만 서브 클래스 및 향상 될 수도 있습니다. 다음은 DirectoryIterator를 사용하여 디렉토리를 반복하는 예입니다.
foreach
출력은 명백히 지정한 경로와 디렉토리의 내용에 따라 다릅니다. 예를 들면 :
<code class="language-php"><?php
// 一个多维数组
$arr = [
["sitepoint", "phpmaster"],
["buildmobile", "rubysource"],
["designfestival", "cloudspring"],
"not an array"
];
// 遍历对象
foreach ($arr as $key => $value) {
// 检查数组
if (is_array($value)) {
foreach ($value as $k => $v) {
echo $k . ": " . $v . "<br>";
}
} else {
echo $key . ": " . $value . "<br>";
}
}</code>
DirectoryIterator 및 기타 여러 SPL ITERATOR의 경우 예외를 사용하여 오류를 처리 할 수 있다는 것을 잊지 마십시오.
<code class="language-php"><?php
// 一个数组(使用PHP 5.4的新简写法)
$arr = ["sitepoint", "phpmaster", "buildmobile", "rubysource",
"designfestival", "cloudspring"];
// 创建一个新的ArrayIterator并传入数组
$iter = new ArrayIterator($arr);
// 遍历对象
foreach ($iter as $key => $value) {
echo $key . ": " . $value . "<br>";
}</code>
<code>0: sitepoint
1: phpmaster
2: buildmobile
3: rubysource
4: designfestival
5: cloudspring</code>
Dribseoryiterator :: isdot (), directoryiterator :: getType () 및 directoryIterator :: getsize ()와 같은 다른 많은 방법을 사용하십시오. DirectoryIterator를 Filteriterator 또는 RegexITerator와 결합하여 특정 조건과 일치하는 파일을 반환 할 수도 있습니다. 예를 들면 :
SPL은 또한 재귀 적 교사를 제공하며, 이는 재귀 르레이 테이터와 같은 방식으로 사용됩니다. 리버스 디렉토리에 재귀 적으로 통과하는 기능에는 종종 유효한 디렉토리 및 파일을 확인하기위한 많은 조건부 검사를 포함하는 반면, 재귀 적 교사는 대부분의 작업을 수행 할 수 있으므로 클리너 코드를 초래할 수 있습니다. 그러나 경고가 있습니다. Recursivedirectoryiterator에는 빈 디렉토리가 반환되지 않습니다. 디렉토리에 많은 하위 디렉토리가 포함되어 있지 않지만 파일이없는 경우 빈 결과를 반환합니다 (GIT의 동작과 유사). <code class="language-php"><?php
// 一个多维数组
$arr = [
["sitepoint", "phpmaster"],
["buildmobile", "rubysource"],
["designfestival", "cloudspring"],
"not an array"
];
// 遍历对象
foreach ($arr as $key => $value) {
// 检查数组
if (is_array($value)) {
foreach ($value as $k => $v) {
echo $k . ": " . $v . "<br>";
}
} else {
echo $key . ": " . $value . "<br>";
}
}</code>
내 출력은 다음과 비슷합니다
요약 <code>0: sitepoint
1: phpmaster
0: buildmobile
1: rubysource
0: designfestival
1: cloudspring
3: not an array</code>
이제 반복이 내가 처음에 생각했던 것만 큼 복잡하지 않다는 것을 깨달았기를 바랍니다. 그것은 우리가 프로그래머들이 매일하는 일입니다. 이 기사에서는 반복과 SPL이 제공 한 일부 클래스를 반복을보다 쉽고 강력하게 만들기 위해 소개했습니다. 물론, 나는 이용 가능한 수업의 샘플의 작은 부분만을 다루고있다. SPL은 "표준"라이브러리입니다. 때로는이 수업이 너무 일반적인 것을 발견 할 수 있으며 항상 귀하의 요구를 충족시키지 못할 수도 있습니다. 이 경우 이러한 클래스를 쉽게 확장하여 자신의 기능을 추가하거나 필요에 따라 기존 기능을 조정할 수 있습니다. 이 시리즈의 다음 부분에서는 SPL 인터페이스를 사용하여 배열처럼 가로 지르고 액세스 할 수있는 고유 한 사용자 정의 클래스를 만드는 방법을 보여 드리겠습니다. Mushakesa / Shutterstock의 사진
SPL Ierators 사용에 대한 faqs
PHP의 SPL이란 무엇이며 왜 중요한가? <code class="language-php"><?php
...
$iter = new RecursiveArrayIterator($arr);
// 遍历对象
// 我们需要创建一个RecursiveIteratorIterator实例
foreach (new RecursiveIteratorIterator($iter) as $key => $value) {
echo $key . ": " . $value . "<br>";
}</code>
SPL은 표준 PHP 라이브러리를 나타냅니다. 일반적인 문제를 해결하도록 설계된 일련의 인터페이스 및 클래스 세트입니다. SPL은 복잡한 작업을보다 효율적으로 처리하는 데 사용할 수있는 많은 데이터 구조, 인터페이스 및 예외를 제공합니다. 쓰기에 필요한 코드의 양을 줄이고 성능을 향상 시키며 코드를 쉽게 읽고 유지 관리 할 수 있기 때문에 중요합니다.
PHP에서 SPL Ierator를 사용하는 방법은 무엇입니까?
SPL Ierator는 데이터 세트를 반복하는 데 사용됩니다. SPL Ierator를 사용하려면 먼저 반복자 클래스의 인스턴스를 만들어야합니다. 그런 다음 반복자의 방법을 사용하여 컬렉션을 반복 할 수 있습니다. 예를 들어, 메소드를 사용하여 현재 항목을 가져오고
메소드를 사용하여 다음 항목으로 이동 한 다음 메소드를 사용하여 반복 할 항목이 더 있는지 확인할 수 있습니다.
spl iterators의 몇 가지 예는 무엇입니까?
각각의 특정 목적을 위해 설계된 다양한 유형의 SPL 반복기가 있습니다. 일부 예는 배열을 반복하기 위해 (디렉토리의 내용을 반복하기 위해);
SPL Ierator를 사용하여 데이터를 필터링하는 방법은 무엇입니까?
FilterIterator 클래스를 사용하여 데이터를 필터링 할 수 있습니다. 이 클래스를 사용하면 컬렉션의 각 항목에 적용되는 사용자 정의 필터를 정의 할 수 있습니다. 필터를 통과하는 항목 만 반복자가 반환합니다.
SPL Ierator를 사용하여 데이터를 정렬하는 방법은 무엇입니까?
배열 클래스를 사용하여 데이터를 정렬 할 수 있습니다. 이 클래스는 컬렉션에서 항목을 정렬하기위한 메소드를 제공합니다. 사용자 정의 비교 함수를 사용하여
SPL 예외는 무엇이며 어떻게 사용합니까?
SPL 예외는 SPL을 위해 특별히 설계된 예외 유형입니다. SPL을 사용할 때 발생하는 오류를 처리하는 방법을 제공합니다. SPL 예외를 사용하려면 블록에 던져 블록으로 잡으십시오.
SPL을 사용하여 파일을 읽고 쓰는 방법은 무엇입니까?
splfileobject 클래스를 사용하여 파일을 읽고 쓸 수 있습니다. 이 클래스는 파일을 열고 읽고, 쓰기, 쓰기 및 닫는 방법을 제공합니다. 또한 파일 포인터를 이동하고 파일 끝에 도달했는지 확인하는 방법을 제공합니다. asort()
SPL을 사용하여 처리 디렉토리를 사용하는 방법은 무엇입니까? uasort()
DirectoryIterator 클래스를 사용하여 디렉토리를 처리 할 수 있습니다. 이 클래스는 디렉토리를 열고 내용을 읽고 디렉토리를 닫는 방법을 제공합니다. 또한 파일이 디렉토리인지 확인하고 파일의 크기, 유형 및 수정 시간을 얻는 메소드도 제공합니다.
SPL을 사용하여 어레이를 처리하는 방법은 무엇입니까?
ArrayObject 및 Arrayiterator 클래스를 사용하여 배열을 처리 할 수 있습니다. 이 클래스는 배열 생성, 항목 추가, 항목 제거 및 항목을 반복하는 방법을 제공합니다. 또한 배열 정렬 및 배열에 항목이 있는지 확인하는 방법도 제공합니다.
SPL을 사용하여 데이터 구조를 처리하는 방법은 무엇입니까?
SPL이 제공 한 다양한 데이터 구조 클래스를 사용하여 데이터 구조를 처리 할 수 있습니다. 이 클래스에는 splstack, splqueue, splheap 및 spliorityqueue가 포함됩니다. 각 클래스는 데이터 구조를 작성하고 항목 추가, 항목 제거 및 항목을 반복하는 방법을 제공합니다. try
위 내용은 SPL Ierators 사용, 1 부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!