Nasıl bir PHP dizi işaretçi depolamak ve sıfırlamak için?

5 Cevap php

Ben bir ilişkisel dizi var, yani

$primes = array(
  2=>2,
  3=>3,
  5=>5,
  7=>7,
  11=>11,
  13=>13,
  17=>17,
  // ...etc
);

sonra yapmam

// seek to first prime greater than 10000
reset($primes);
while(next($primes) < 10000) {}
prev($primes);

// iterate until target found
while($p = next($primes)) {
      $res = doSomeCalculationsOn($p);

      if( IsPrime($res) )
          return $p;
}

Sorun, IsPrime de $ asal dizi aracılığıyla döngüler olduğunu

function IsPrime($num) {
    global $primesto, $primes, $lastprime;

    if ($primesto >= $num)
        // using the assoc array lets me do this as a lookup
        return isset($primes[$num]);

    $root = (int) sqrt($num);
    if ($primesto < $root)
    	CalcPrimesTo($root);

    foreach($primes as $p) {       // <- Danger, Will Robinson!
    	if( $num % $p == 0 )
    		return false;

    	if ($p >= $root)
    		break;
    }

    return true;
}

Hangi ben yinelemeye ediyorum dizi işaretçi trashes.

Ben bu yan etkisi yok yani IsPrime in () fonksiyonu dizinin iç imlecini kaydetmek ve geri yüklemek mümkün olmak istiyorum. Bunu yapmak için herhangi bir yolu var mı?

5 Cevap

Dizi işaretçileri güvenmeyin. Yerine Yineleyicilerde kullanın.

Sen ile dış kodunuzu değiştirebilirsiniz:

foreach ($primes as $p) {
  if ($p > 10000 && IsPrime(doSomeCalculationsOn($p))) {
    return $p;
  }
}

Dizinin devlet "kaydet" yapabilirsiniz:

$state = key($array);

Ve (daha iyi bir yöntem varsa emin değilim) "geri":

reset($array);

while(key($array) != $state)
    next($array);

Hızlı bir sorun değildir ve php bellek zorlayan değil sınırlar eğer hızlı çözüm sadece asal dizi çoğaltmak ve 2 farklı olanları yineleme etmektir.

$awesomePrimes=$primes;

Sonra $awesomePrimes için işlevi küresellerle ve foreach değiştirmek

Nasıl bir daha int -> int dizi, indeks n ve değeri birleşmeli dizinin indeksi 0'dan çalışan sayısı nedir? Yapıyor hakkında Yani, sen olurdu:

$pointer = array(
  0 => 2,
  1 => 3,
  2 => 5,
  // ...
);

ve bunun yerine $prime Eğer $prime[$pointer[$i]] kullanın, ya da benzer bir şey olur doğrudan atıfta?

Bir senin yineleme biri için döngü "için" kullanın. Örneğin sizin IsPrime yönteminde bu döngü kullanmak:

$primesLength = count($primes); // this is to avoid calling of count() so many times.
for ($counter=0 ; $counter < $primesLength ; $counter++) {
    $p = $primesLength[$counter];
    if( $num % $p == 0 )
            return false;

    if ($p >= $root)
            break;
}

bu şekilde iç dizi gösterici yönteminde kullanılmayacaktır.