我需要将一个字符串转换为一组固定长度的数组。
示例:输入: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_split
和str_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
)
您没有遗漏什么,这不是内置的东西。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));
}