整数の配列があります
Array
(
[0] => Array
(
[0] => 1531412763
[1] => 1439959339
[2] => 76
[3] => 122
[4] => 200
[5] => 4550
[6] => 444
)
...
など、データベースであるかのように見ると、最も外側の配列の要素が行で、内側の配列の要素が列であると思います。
その情報をファイルに保存して、後で取得できるようにしたいのですが、スペースを節約するためにバイナリデータとして保存したいと思います。基本的に、例から最初の整数を書くと1531412763
ファイルに10バイトかかりますが、符号付き整数として保存できれば4バイトになります。
fwrite
の使用を提案している他の多くの回答を見てきましたが、そのような方法での使用方法が理解できませんか?
バイナリデータをファイルに書き込むには、関数 pack()
および unpack()
を使用できます。 Packはバイナリ文字列を生成します。結果は文字列になるため、intを1つの文字列に連結できます。次に、この文字列を1行としてファイルに書き込みます。
このようにして、ファイルを行の配列に配置する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);