将字符串转换为具有固定长度的一组数组

时间:2011-06-20 17:28:55

标签: php string optimization

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

示例:输入: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:我认为字符串太大了。我将不得不看看是否有一种方法可以在不丢失数据的情况下将其分解,因为这实际上是一个小例子而且它实际上是二进制数据。谢谢大家的答案!

5 个答案:

答案 0 :(得分:14)

试试这个。我刚用10,000字的字符串进行了测试,并没有耗尽内存:

$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
    )

答案 1 :(得分:3)

str_split函数可能会对您有所帮助,但您必须自己处理最后一个块。

答案 2 :(得分:1)

使用类似

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

无论如何,处理内存不足错误的一种方法可能是创建一个php脚本,它只会修复你的内部“for循环”,然后在最大的循环中调用PHP exec

这将导致进程为每个“循环作业”启动一个线程而不会溢出内存

答案 3 :(得分: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);
}

答案 4 :(得分:0)

将子串推送到数组

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