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


Converting a string to a set of array with fixed length

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

示例:输入: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:字符串长度实际上是745982字节,我看的是压缩后的长度。

编辑3:我觉得这个字符串太大了。我必须看看是否有一种方法可以在不丢失数据的情况下分解它,因为这实际上是一个小例子,它实际上是二进制数据。谢谢大家的回答!

试试这个。我刚刚用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
    )
str_split函数可能会对您有所帮助,但您必须自己处理最后一个块。

您没有遗漏什么,这不是内置的东西。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);
}

使用类似的东西

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

无论如何,处理内存不足错误的一种方法可以是创建一个php脚本,该脚本只嵌入您的内部"for循环",然后在最大的循环中调用php exec。

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

将子字符串推送到数组

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