Преобразование строки в набор массивов с фиксированной длиной - PullRequest
2 голосов
/ 20 июня 2011

Мне нужно преобразовать строку в набор массивов фиксированной длины.

Пример: input: 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: Длина строки на самом деле составляет 745 982 байта, я искал сжатую длину.

РЕДАКТИРОВАТЬ 3: Я думаю, что строка слишком велика.Мне придется посмотреть, есть ли способ разбить его без потери данных, так как это на самом деле небольшой пример, а на самом деле это двоичные данные.Спасибо всем за ответы!

Ответы [ 5 ]

14 голосов
/ 20 июня 2011

Попробуй это. Я только что проверил со строкой 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
    )
3 голосов
/ 20 июня 2011

Функция str_split может помочь вам, но вам придется обрабатывать последний блок самостоятельно.

1 голос
/ 20 июня 2011

Вы не пропустите что-то, это не что-то встроенное.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);
}
1 голос
/ 20 июня 2011

Используйте что-то вроде

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

В любом случае, одним из способов обработки ошибок нехватки памяти может быть создание сценария php, который только реализует ваш внутренний цикл for, а затем вызывает PHP exec внутри самого большого цикла.

Это приведет к тому, что процесс запустит поток для каждого "зацикленного задания" без переполнения памяти

0 голосов
/ 20 июня 2011

Вставить подстроки в массив

$result = array();
for ($index=0; $index<=strlen($string)-$width; $index+= $width)
{
array_push($result,substr($string,$index,$width));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...