2014-02-06 2 views
3

값을 산출하는 메서드가있는 경우 PHP> = 5.5를 사용하면 이러한 값을 계산하는 가장 좋은 방법은 무엇입니까?PHP - 생성기 수를 계산하는 방법

내가 기대했던 것은 Generator를 배열로 변환하여 계산할 수 있지만 빈 배열을 반환한다는 것이 었습니다. 비어 있지는 않지만 생성기가 비어있는 것으로보고되므로 Count()도 작동하지 않습니다.

나는 이것에 당황하고있다. 발전기 수를 세지 않아도된다면 좋은 점입니다. 그렇지 않으면 그다지 요점이별로 없습니다. 생성자가 비어 있는지 감지하는 방법은 key() 메서드를 사용하고 NULL을 반환하는 경우 yield가 없거나 생성자가 이미 반복되어 현재 포인터가 null임을 의미합니다.

+0

나는 당신이 무슨 말을하고 있는지 전혀 모른다. – AmazingDreams

+0

이 글을 게시하는 순간 나는 게시물에 언급 된 count() 만 시도했지만 작동하지 않았습니다. 내가 가진 특정 프로그래밍 문제이기 때문에 나는 또한 주제에 대해서도 다루고있다. 코드 예제를 제공하는 것에 관해서는, 현재의 사용법을 보여주기 위해 할 수 있다고 생각하지만,이 게시물을 클릭 한 사람들이 PHP의 사용량을 알 수있을 것이라고 기대하고있었습니다. 커버 된 것으로, 나는 어떤 규칙도 어기지 못함을 깨닫지 만, 그렇게한다면 나는 정말로 미안하다. – JLT93

답변

6

generator은 데이터 구조가 아닙니다. 이는 Generator 클래스의 인스턴스이며, 실제로는 Iterator의 특수한 종류입니다. 따라서, 당신이 직접 항목을 셀 수 없다 -

것은 계산하기 (정확합니다. Generator 클래스는 Iterator 인터페이스를 구현하기 때문에 그건 아닌 Countable 인터페이스 솔직히 말해서, 나는 그것을 구현할 수있는 방법을 상상할 수 없다) 네이티브 생성기를 사용하면 값을 반복 할 수 있습니다. 하지만 대부분의 경우 입니다. 수혜자가 몇 명인지 결정됩니다. 상식적으로는 할 수 없습니다. 매뉴얼에서 유명한 xrange() 샘플 : 당신이 볼 수 -as

function xrange($start, $limit, $step = 1) { 
    if ($start < $limit) { 
     if ($step <= 0) { 
      throw new LogicException('Step must be +ve'); 
     } 

     for ($i = $start; $i <= $limit; $i += $step) { 
      yield $i; 
     } 
    } else { 
     if ($step >= 0) { 
      throw new LogicException('Step must be -ve'); 
     } 

     for ($i = $start; $i >= $limit; $i += $step) { 
      yield $i; 
     } 
    } 
} 

, 그것은 국경을 정의해야합니다 당신입니다. 그리고 최종 집계는 그것에 달려 있습니다. 생성기를 통한 반복은 정의 된 정적 경계 (static-borders) 생성기에서만 의미가 있습니다 (예 : 항목 수가 항상 정적 인 경우 - 예 : 생성기 내에서 엄격하게 정의 된 경우). 다른 경우에는 매개 변수 종속 결과가 나타납니다.

function getCount(Generator $functor) 
{ 
    $count = 0; 
    foreach($functor as $value) 
    { 
     $count++; 
    } 
    return $count; 
} 

- 그리고 사용 : xrange()를 들어 당신이 볼 수 -as

var_dump(getCount(xrange(1, 100, 10)));//10 
var_dump(getCount(xrange(1, 100, 1)));//100 

변경됩니다 "계산". 심지어 발전기가 유한 한 것은 아닙니다. 그것은 무한한 값을 산출 할 수 있습니다 (예를 들어, 테두리는 외부 루프에서 정의됩니다). 이것은 "카운팅"을 거의 감지 할 수없는 또 하나의 이유입니다. 당신이 그것을해야 할 경우

+0

나는 이해한다. 내 상황에서는 실제로 하나의 "yield"문이있는 동안 데이터베이스에서 여러 행의 객체를 생성했습니다. 여러 번 반복됩니다. 내가 생각해 낼 수있는 유일한 방법은 생성기를 복제하고 그것을 반복하는 것입니다 (원본 생성기가 해당 데이터에 대해 반복 처리되도록 허용하거나 행을 개별적으로 계산할 수있게합니다). 그래서 당신이 말한 것에 따라, 최선의 방법으로 그것을 사용해서는 안됩니다. – JLT93

+0

SQL에는 'COUNT' 그룹화 기능이 있습니다. 그 대신에 –

+0

을 사용하십시오. 제너레이터가 무한대 인 경우 카운팅이 유용하지 않다고 가정합니다. 그러나 동일한 제너레이터를 무한히 사용하는 경우에는 생성기에 저장된 값을 사용할 수 없게됩니다. 결국 결국 멈추지 않으면 안되게 값을 산출합니다. 맞습니까? 행 수를 계산하면 COUNT를 사용하지만 별도의 쿼리 여야합니다. 하나는 행 수를, 다른 하나는 데이터를 얻습니다. 그런 다음 발전기의 첫 번째 값이 행 수인 데이터를 계산합니다. 어떻게 그렇게 할 수 있니? – JLT93

5

, 당신은 기본 기능을 하나 개의 라인에서 작업을 수행 할 수 있습니다

count(iterator_to_array($generator, false)); 

그러나주의해야합니다. 이 후 $generator이 실행되고 이 (가)이됩니다. 따라서 같은 줄을 foreach에 넣으면 항상 0 번 반복됩니다.

발전기는 설계 상으로 매우 동적이어서 (배열과 같은 고정 데이터 구조와 달리) count() 또는 rewind()을 제공하지 않습니다.

+0

네이티브 함수를 사용하면 @Alma Do가 설명하는 것보다이 메서드를 더 효율적으로 사용할 수 있기를 바랍니다. 배열을 계산하는 것이 아니라 정렬하는 데 사용할 수 있습니까? –

1

count()은 사용할 수 없지만 참조를 사용하여 외부 세계에 액세스 할 수 있도록 카운트를 설정할 수 있습니다.

function generate(&$count = 0) { 
    // we have 4 things 
    $count = 4; 
    for($i = 0; $i < $count; $i++) { 
     yield $i; 
    } 
} 

$foo = generate($count); 
echo $count; // 4 
foreach ($foo as $i) { 
    echo $i; 
} 

단점은 몇 개가 남아 있지만 얼마나 많이 시작했는지 알려주지 않는 것입니다.

관련 문제