2011-06-20 105 views
2

我需要将一个字符串转换为一组固定长度的数组。将字符串转换为固定长度的一组数组

例如:输入:1111122222333333

我需要的

[0] => 
    [0] => 1 
    [1] => 1 
    [2] => 1 
    [3] => 1 
    [4] => 1 
[1] => 
    [0] => 2 
    [1] => 2 
    [2] => 2 
    [3] => 2 
    [4] => 2 

下面的代码输出的伟大工程:

for ($x = 0; $x < count($codedDataArray) - $colWidthSum + 1; $x += $colWidthSum + 1) { 

     for ($c = 0; $c <= $colWidthSum; $c++) { 
      $rows[$j][] = $codedDataArray[$z]; 
      $z++; 
     } 
     $j++; 
    } 

但它运行时内存不足,我给它真正的大串,比如10959字节。

是否有一个内置的PHP函数我错过了会做同样的事情,或者我只是将不得不处理内存问题?

编辑1:我在preg_splitstr_split上的内存不足,所以我可能在做一些非常错误的操作。一旦我弄清楚我最初的问题是什么,我仍然会回答。

编辑2:字符串长度实际上是745,982字节,我正在查看压缩的长度。

编辑3:我觉得字符串太大了。我将不得不查看是否有破坏它的方式而不会丢失数据,因为这实际上是一个小例子,它实际上是二进制数据。感谢大家的回答!

+0

运行内存不足或无限循环? –

+0

内存不足。作品找到长度为137的流,所以我不认为这是一个循环。 – Drazisil

+0

似乎不应该用11k字符串... –

回答

14
尝试

此。我只是用10000个字的字符串进行测试,并没有耗尽内存:

$array = str_split($string); 

// returns $array = Array 
(
    [0] => 1 
    [1] => 1 
    [2] => 1 
    [3] => 1 
    [4] => 1 
    [5] => 2 
    [6] => 2 
    [7] => 2 
    [8] => 2 
    [9] => 2 
    [10] => 3 
    [11] => 3 
    // and so on 
) 

然后:

array_chunk($array, 5); 

// returns: 

[0] => Array 
    (
     [0] => 1 
     [1] => 1 
     [2] => 1 
     [3] => 1 
     [4] => 1 
    ) 

[1] => Array 
    (
     [0] => 1 
     [1] => 2 
     [2] => 2 
     [3] => 2 
     [4] => 2 
    ) 
+0

+1,因为这是我脑海中的合适解决方案。 –

3

str_split函数可能会帮助你,但你必须自己处理最后一块。

+0

看起来很有希望,但是内存也不足。 – Drazisil

+1

更具体地说,你的示例输出需要两个分割,你可以用'array_map('str_split',str_split($ str,$ length))''来得到它。 如果内存耗尽,则可能需要提高PHP的“max_memory”限制设置。 – r3c

0

子推到阵列

$result = array(); 
for ($index=0; $index<=strlen($string)-$width; $index+= $width) 
{ 
array_push($result,substr($string,$index,$width)); 
} 
1

使用类似

$str = '1111122222333333'; 
$result = array_chunk(str_split($str), 5); 
print_r($result); 

不管怎么说,一个处理内存不足错误的方法可以是创建一个仅用于内部“for循环”的php脚本,然后在最大循环内调用PHP exec

这将导致进程推出针对每一个“循环任务” a线程不会溢出内存

+0

我想我可能不得不去php执行路线,除非我能弄清楚是什么导致调制解调器问题。我可以扩大最大记忆,但这只是意味着我愿意接受我有差的代码。 – Drazisil

+0

这是'preg_split()'的一个不好的用法,因为你不需要正则表达式。 'str_split()'在这种情况下做同样的事情,并会更好地执行。它已经被** Damien Pirsy **提议。 –

1

你不能缺少的东西,这不是内置。 PHP在解析字符串方面很出色,但对于大量输入可能会遇到困难。

如果你知道块的长度(和它看起来像你这样做):

// Breaks the strink into $chunkLength sized pieces. 
$arr = str_split($input, $chunkLenght); 
// str_split all of the chunks: 
// explode technically is more historic, but str_split is easier. 
array_walk($arr, 'str_split'); 

如果你不知道块的大小,你需要明白这一点:

$sizes = array(); 
$current = FALSE; 
$len = count($input); 
$curCount = 0; 

for($i = 0; $ < $len; $i++){ 
    if($current != $input[$i]) { 
     $current = $input[$i]; 
     $sizes[$current] = $curCount; 
     $curCount = 0; 
    } 
    $curCount++; 
} 

function get_filled_array($num, $count) { 
    return arrat_pad(array(), $count, $num); 
} 
$output = array(); 

foreach($sizes as $index => $count) { 
    $output[$index] = get_filled_array($index, $count); 
} 
相关问题