【问题标题】:Converting a string to a set of array with fixed length将字符串转换为一组固定长度的数组
【发布时间】:2011-10-19 03:49:41
【问题描述】:

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

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

【问题讨论】:

  • 内存不足或死循环?
  • 内存不足。作品在长度为 137 的流上找到,所以我不认为这是一个循环。
  • 似乎不应该使用 11k 字符串...

标签: php string optimization


【解决方案1】:

试试这个。我刚刚用一万字串测试过,并没有耗尽内存:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看起来很有希望,但内存也用完了。
    • 更具体地说,您的示例输出需要两次拆分,您可以使用array_map ('str_split', str_split ($str, $length)) 之类的方式获得它。如果内存不足,那么您可能需要提高 PHP“max_memory”限制设置。
    【解决方案3】:

    你没有错过什么,这不是内置的。 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】:

      使用类似的东西

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

      无论如何,处理内存不足错误的一种方法是创建一个 php 脚本,该脚本仅实现您的内部“for 循环”,然后在最大循环内调用 PHP exec

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

      【讨论】:

      • 我想我可能不得不走 php exec 路线,除非我能弄清楚是什么导致了调制解调器问题。我可以扩大最大内存,但这只是意味着我愿意接受我的代码很糟糕。
      • 这是对preg_split() 的不好使用,因为您不需要正则表达式。 str_split() 在这种情况下会做同样的事情,并且性能会更好。 Damien Pirsy 已经提出了建议。
      【解决方案5】:

      将子字符串推入数组

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多