문제

PHP에 관한 것이지만 다른 언어에도 동일한 의견이 많이 적용될 것이라는 데는 의심의 여지가 없습니다.

간단히 말해서, 다양한 PHP 루프 유형의 차이점은 무엇입니까?하나가 다른 것보다 더 빠르거나 더 좋습니까? 아니면 가장 읽기 쉬운 루프를 넣어야 합니까?

for ($i = 0; $i < 10; $i++)
{
    # code...
}


foreach ($array as $index => $value)
{
    # code...
}


do
{
    # code...
}
while ($flag == false);
도움이 되었습니까?

해결책

For 루프와 While 루프는 진입 조건 루프입니다.조건을 먼저 평가하므로 조건이 충족되지 않으면 루프와 관련된 명령문 블록이 한 번도 실행되지 않습니다.

이 for 루프 블록 내부의 명령문은 10번 실행되며 $i의 값은 0~9입니다.

for ($i = 0; $i < 10; $i++)
{
        # code...
}

while 루프에서도 동일한 작업이 수행됩니다.

$i = 0;
while ($i < 10)
{
    # code...
    $i++
}

Do-while 루프는 종료 조건 루프입니다.한 번 실행되는 것이 보장되며, 블록을 반복하기 전에 조건을 평가합니다.

do
{
        # code...
}
while ($flag == false);

foreach는 처음부터 끝까지 배열 요소에 액세스하는 데 사용됩니다.foreach 루프가 시작될 때 배열의 내부 포인터는 배열의 첫 번째 요소로 설정되고, 다음 단계에서는 배열의 두 번째 요소로 설정되는 식으로 배열이 끝날 때까지 계속됩니다.루프 블록에서는 현재 배열 항목의 값을 $value로 사용할 수 있고 현재 항목의 키를 $index로 사용할 수 있습니다.

foreach ($array as $index => $value)
{
        # code...
}

다음과 같이 while 루프를 사용하여 동일한 작업을 수행할 수 있습니다.

while (current($array))
{
    $index = key($array);  // to get key of the current element
    $value = $array[$index]; // to get value of current element

    # code ...  

    next($array);   // advance the internal array pointer of $array
}

그리고 마지막으로: PHP 매뉴얼 당신의 친구입니다 :)

다른 팁

이것은 CS101이지만 다른 사람이 언급하지 않았기 때문에 while 루프는 코드 블록 이전에 조건을 평가하고 do-while은 코드 블록 이후에 평가하므로 do-while 루프는 항상 코드 블록을 적어도 한 번 실행하도록 보장됩니다. 조건에 관계없이.

@브렌든:

귀하가 인용한 기사는 매우 오래되었으며 정보가 완전히 잘못되었습니다.특히 마지막 점(사용 for 대신에 foreach)은 오해의 소지가 있으며 이 문서에 제공된 근거는 더 이상 최신 버전의 .NET에 적용되지 않습니다.

그것이 사실이기는 하지만 IEnumerator 가상 통화를 사용합니다. ~할 수 있다 실제로 최신 컴파일러에 의해 인라인됩니다.또한 .NET은 이제 제네릭과 강력한 형식의 열거자를 알고 있습니다.

실제로 다음과 같은 사실을 입증하는 수많은 성능 테스트가 있습니다. for 일반적으로 다음보다 빠르지 않습니다. foreach. 여기에 예가 있습니다.

일반적인(인덱싱된?) 배열을 반복할 때 첫 번째 루프를 사용하고 연관 배열을 처리할 때 foreach 루프를 사용합니다.제 생각에는 이는 자연스러워 보이고 코드 흐름을 돕고 가독성을 높이는 데 도움이 됩니다.do...while 루프의 경우 배열을 뒤집는 것 이상의 작업을 수행해야 할 때 사용합니다.

하지만 성능상 이점이 있는지는 잘 모르겠습니다.

두 경우 모두 성능이 크게 향상되지는 않습니다.While은 반복보다 더 복잡한 작업에 유용하지만 for 그리고 while 기능적으로 동일합니다.

Foreach 좋지만 한 가지 중요한 주의 사항이 있습니다.너 수정할 수 없습니다 당신이 반복하고 있는 열거형.따라서 항목을 제거하거나 추가하거나 교체할 필요가 없습니다.물론 항목을 수정하는 것(예: 속성 변경)도 괜찮습니다.

foreach 루프를 사용하면 내부에서 사용할 수 있도록 원래 배열의 복사본이 메모리에 만들어집니다.큰 구조물에는 사용하면 안 됩니다.간단한 for 루프가 더 나은 선택입니다.다음과 같이 숫자로 인덱스되지 않은 대규모 구조에서 while 루프를 보다 효율적으로 사용할 수 있습니다.

while(list($key, $value) = each($array)) {

그러나 이러한 접근 방식은 단순한 작은 구조의 경우 특히 보기 흉합니다.

while 루프는 스트림을 통한 루프에 더 적합하거나 PHP에서 매우 자주 볼 수 있는 다음 예제와 같습니다.

while ($row = mysql_fetch_array($result)) {

거의 항상 서로 다른 루프를 교체할 수 있으며 이는 a) 효율성 또는 b) 명확성으로 귀결됩니다.

다양한 유형의 루프의 효율성 장단점을 알고 있다면 예, 원래 질문에 대답하십시오.가장 깨끗해 보이는 것을 사용하세요.

각 루프 구성은 서로 다른 목적으로 사용됩니다.

for - 특정 반복 횟수만큼 반복하는 데 사용됩니다.

foreach - 컬렉션의 모든 값을 반복하는 데 사용됩니다.

while - 조건을 충족할 때까지 반복하는 데 사용됩니다.

세 가지 중에서 "while"이 대부분의 상황에서 최상의 성능을 제공할 가능성이 높습니다.물론, 다음과 같은 작업을 수행하면 기본적으로 "for" 루프를 다시 작성하게 됩니다(C#에서는 성능이 약간 더 좋습니다).

$count = 0;
do
{
   ...
   $count++;
}
while ($count < 10);  

그것들은 모두 기본 목적이 다르지만 어느 정도 동일한 방식으로 사용될 수도 있습니다.이는 해결하려는 특정 문제에 전적으로 달려 있습니다.

foreach 루프를 사용하면 내부에서 사용할 수 있도록 원래 배열의 복사본이 메모리에 만들어집니다.

Foreach는 훌륭하지만 한 가지 중요한 주의 사항이 있습니다.반복하는 열거형을 수정할 수 없습니다.

값 대신 참조로 전달하면 둘 다 문제가 되지 않습니다.

 foreach ($array as &$value) {

PHP 5부터 허용된 것 같습니다.

배열의 요소에 액세스할 때 명확성을 위해 가능할 때마다 foreach를 사용하고 실제 인덱스 값이 필요한 경우에만 for를 사용합니다(예: 여러 배열의 동일한 인덱스).for 루프를 사용하면 이 모든 것이 너무 쉬워지기 때문에 오타 실수가 발생할 가능성도 최소화됩니다.일반적으로 PHP는 성능에 대해 너무 걱정할 필요가 없습니다.그리고 마지막으로 중요한 것은 for와 foreach가 가지고 있는 것(또는 가지고 있어야 하는 것)입니다.저는 PHP 사용자가 아닙니다. 동일한 Big-O 시간(O(n))이므로 메모리 사용량이 조금 더 많거나 시간에 따라 약간의 상수 또는 선형 적중이 발생할 수 있습니다.

성능과 관련하여 foreach는 for보다 더 많이 소모됩니다.

http://forums.asp.net/p/1041090/1457897.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top