Array -> String

young

Новичок
Array -> String

Есть массив с байтами, представлябщими строку.
Большого размера (~50 000 элементов)

Как с наименьшими потерями памяти перегнать его в строку?

На текущий момент делается это так

PHP:
$str = '';      
for ($i=0; $i<=$arr[0]; $i++) {
  $str .= chr($arr[$i]);
}
 

filter

Новичок
Может уничтожать последовательно массив?

$str = '';
while( $item = array_shift ($arr) ){
$str .= chr($item);
}

P.S. Код не проверял.
 

filter

Новичок
Понятия не имею как в PHP внутри организована работа с массивами, может вариант выше и не будет производительным.
Может будет лучше использовать array_pop или к твоему коду дописать в конце цикла unset($arr[$i]);
 

Crazy

Developer
Я бы посмотрел в сторону array_reduce. Но это тоже извращение.
 

young

Новичок
Пока что лидирует pack
Но как в него засунуть массив что бы весь и сразу?
 

Falc

Новичок
young
Не понятно причем тут потери памяти?
У тебя уже есть массив, а при перегонке в строку особо памяти не требуется, или я что-то пропустил?
 

filter

Новичок
2young:
О какой потери ты говоришь?

Вроде твой пример с pack ни чем не уступает и первому примеру.
 

Blindman

Новичок
У меня (Win XP, PHP 4.3.4) в процессе работы твоего скрипта расход памяти увеличивается максимум на 50кб, то есть размер строки (смотрю через Task manager).
После unset($arr) тот же Task manager показывает уменьшение расхода памяти на ~5мб
чего тут минимизировать?
 

Falc

Новичок
young
Если тебе надо быстродействие то лучше использовать такой цикл:
$i=count($arr)-1;
do{
$str .= chr($arr[$i]);
} while( $i-- );
 

Falc

Новичок
Самый быстрый код у меня получился вот какой:
PHP:
$str = ''; 
$size = sizeof($arr);
do{
$str .= pack('c*', $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++], $arr[$i++] );
}while( $i < $size );
Правда размер массива должен быть кратен 16, хотя это легко исправить :)
 

mmaaxx

Guest
Попробуйте:
PHP:
$s='';
do{$s.=current($arr);}while(next($arr));
По идее использование next(), prev() - более быстрый вариант, чем позиционирование на конкретную ячейку (ели конечно массивы на низком уровне представляються в виде денамических структур).
Или вариант Falc с использованием next($arr) вместо $arr[$i++], ну и другие изменения связанные с этим.
 

mmaaxx

Guest
young
Почему?

Сорри, прочитал задачу во второй раз.
$s='';
do{$s.=pack('c*',current($arr));}while(next($arr));
 

young

Новичок
2mmaaxx: Ты не понял изначального условия. Прочитай еще раз топик. Твой скрипт что-то делает, но совсем не то что требовалось
 

mmaaxx

Guest
young
Прочитал, поправил.

$s='';
do{$s.=pack('c*',current($arr));}while(next($arr));
 

young

Новичок
2mmaaxx: А теперь протестируй на скорость с уже предложенным решением
 
Сверху