1

我做了一个函数将返回序列号的第 N 位,例如:

1234567891011121314151617

  • 第 5 个数字是 5
  • 第 20 位是 1

我的功能是这样的

 <?php
   function getLength($number) {
   $length = 0;
   if ($number == 0){
      $length = 1;
   } else {
      $length = (int) log10($number)+1;
   }
     return $length;
  }
 ?>

<?php
 function getDigitNumber($digit){
   $number = 10000000000;
   $data = array();
   for($i=1;$i<=$number;$i++){  
   if(getLength($i) > 1){
     $array = str_split($i,1);
    for($n=0;$n<=count($array)-1;$n++){
        array_push($data,$array[$n]);
    }   
}else{
    $data[$i] = $i;
}
  } 
return $data[$digit];
}
?>

当我执行时,我遇到了这样的错误消息“致命错误:允许的内存大小为 134217728 字节已用尽(尝试分配 36 字节)”。也许是因为我在 var 中分配了一个很大的数字$number

我该如何解决..或者我怎样才能制作可以处理这些大量数字的功能

谢谢..

4

2 回答 2

10

我做了一个函数将返回序列号的第 N 位,例如:

1234567891011121314151617

The 5-th digit is 5
The 20-th digit is 1

为什么不:

$number[5];
$number[20];

无论如何,数字必须是字符串,因此只需使用数组语法访问字符。

于 2013-01-30T01:08:26.710 回答
2

关于内存问题,确实是因为数量多:

$number = 10000000000;
$data = array();
for($i=1;$i<=$number;$i++){  
    if(getLength($i) > 1){
        $array = str_split($i,1);
        for($n=0;$n<=count($array)-1;$n++){
            array_push($data,$array[$n]);
        }
    } else{
        $data[$i] = $i;
    }
} 

$data基本上,它分配了一个包含约 500,000,000,000 个项目的数组 ( ),这是相当大的......

按照其他答案/评论中的建议将您的数字作为字符串(或字符数组)操作将是:更容易,更易读,更快,更少内存消耗,......

于 2013-01-30T01:29:15.060 回答