如何存储和重置PHP数组指针?

时间:2008-11-30 03:16:47

标签: php arrays loops

我有一个关联数组,即

$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()函数中保存和恢复数组的内部指针,因此它没有这种副作用。有没有办法做到这一点?

5 个答案:

答案 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;
}

这样就不会在方法中使用内部数组指针。