我有一个关联数组,即
$primes = array(
2=>2,
3=>3,
5=>5,
7=>7,
11=>11,
13=>13,
17=>17,
// ...etc
);
然后我做
// 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;
}
问题是IsPrime还遍历$ primes数组,
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;
}
它会遍历我正在迭代的数组指针。
我希望能够在IsPrime()函数中保存和恢复数组的内部指针,因此它没有这种副作用。有没有办法做到这一点?
答案 0 :(得分:4)
您可以“保存”数组的状态:
$state = key($array);
并且“恢复”(不确定是否有更好的方法):
reset($array);
while(key($array) != $state)
next($array);
答案 1 :(得分:4)
不要依赖数组指针。改为使用迭代器。
您可以使用以下代码替换外部代码:
foreach ($primes as $p) {
if ($p > 10000 && IsPrime(doSomeCalculationsOn($p))) {
return $p;
}
}
答案 2 :(得分:0)
如果速度不是问题并且您没有推动php内存限制,那么最快的解决方案就是复制素数数组并迭代2个不同的数组。
$awesomePrimes=$primes;
然后将函数中的globals和foreach更改为$awesomePrimes
答案 3 :(得分:0)
如何再做一个int -> int
数组,其中索引是从0到 n 的运行数字,值是关联数组的索引?所以,你会有:
$pointer = array(
0 => 2,
1 => 3,
2 => 5,
// ...
);
而不是直接引用$prime
,而是使用$prime[$pointer[$i]]
或类似内容?
答案 4 :(得分:0)
为您的一次迭代使用“for”循环。例如,在IsPrime方法中使用此循环:
$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;
}
这样就不会在方法中使用内部数组指针。