2015-04-28 7 views
1

pack() синтаксис (от http://php.net/manual/en/function.pack.php)PHP Передача массива в пакет функции()

string pack (string $format [, mixed $args [, mixed $... ]])

так предполагая, мне нужно упаковать три байта

$packed = pack("c*", 65, 66, 67);

Но что, если у меня есть для упаковки произвольного количества байтов?

Они могли coveniently быть сохранены в массиве, так что я наивно пытался

$a = array(65, 66, 67); 
$packed = pack("c*", $a); 

Но это не работает.

Есть ли способ сделать pack() работать с массивом?

+2

Я думаю, что это должно помочь вам: http://stackoverflow.com/a/5473057/3933332 – Rizier123

+0

Не приятно unaccept рабочий ответ на PHP когда это конкретный ответ php5.6 + был дан позже, когда php5.6 не был задан в вопросе:) ... Моя кукла из вуду почти полностью завершена. – inquam

ответ

5

В немного поздно к партии, но для справок в будущем вы можете использовать новый оператор (v5.6 +), чтобы взорвать массив inline:

$packed = pack("c*", ...$a); 
2

Вы можете создать свою собственную функцию array_pack, что внутренне вызывает pack с использованием call_user_func или call_user_func_array функции, так что вы можете передать правильное количество параметров к нему.

Нечто подобное, вероятно, может работать (не тестировался, хотя ... Но вы получите общее представление)

function array_pack(array $arr) { 
    return call_user_func_array("pack", array_merge(array("c*"), $arr))); 
} 
1

Я использую эту функцию:

private function pack_array($format, $arg) 
{ 
    $result=""; 
    foreach ($arg as $item) $result .= pack ($format, $item); 
    return $result; 
} 
0

Другой вариант, если вы не можете использовать ... оператор:

$packed = array_reduce($a, function($carry, $item) { 
    return $carry .= pack('c', $item); 
});