У меня есть массив целых
Array
(
[0] => Array
(
[0] => 1531412763
[1] => 1439959339
[2] => 76
[3] => 122
[4] => 200
[5] => 4550
[6] => 444
)
...
И так далее, я полагаю, если я смотрю на это так, как если бы это была база данных — элементы самого внешнего массива — это строки, а элементы внутренних массивов — это столбцы.
Я хочу сохранить эту информацию в файл, чтобы позже ее можно было найти, но я хочу сохранить ее как двоичные данные, чтобы сэкономить место. В основном, если я напишу первое целое число из примера 1531412763
в файл это займет 10 байтов, но если бы я мог сохранить его как целое число со знаком, это заняло бы 4 байта.
Я посмотрел на ряд других ответов, которые все предлагают использовать fwrite
что я не могу понять, как использовать таким образом?
Для записи двоичных данных в файл вы можете использовать функции pack()
а также unpack()
. Pack выдаст двоичную строку. В результате получается строка, вы можете объединить целые в одну строку. Затем напишите эту строку в виде строки в ваш файл.
Таким образом, вы можете легко читать с file()
который поместит файл в массив строк. Тогда просто unpack()
каждая строка, и у вас есть свой исходный массив обратно.
Что-то вроде этого :
$arr = array(
array ( 1531412763, 1439959339 ),
array ( 123, 456, 789 ),
);
$file_w = fopen('binint', 'w+');
// Creating file content : concatenation of binary strings
$bin_str = '';
foreach ($arr as $inner_array_of_int) {
foreach ($inner_array_of_int as $num) {
// Use of i format (integer). If you want to change format
// according to the value of $num, you will have to save the
// format too.
$bin_str .= pack('i', $num);
}
$bin_str .= "\n";
}
fwrite($file_w, $bin_str);
fclose($file_w);// Now read and test. $lines_read will contain an array like the original.
$lines_read = [];
// We use file function to read the file as an array of lines.
$file_r = file('binint');
// Unpack all lines
foreach ($file_r as $line) {
// Format is i* because we may have more than 1 int in the line
// If you changed format while packing, you will have to unpack with the
// corresponding same format
$lines_read[] = unpack('i*', $line);
}
var_dump($lines_read);
Других решений пока нет …