web-dev-qa-db-ja.com

文字通り、バイナリデータをファイルに書き込む

整数の配列があります

Array
(
    [0] => Array
        (
            [0] => 1531412763
            [1] => 1439959339
            [2] => 76
            [3] => 122
            [4] => 200
            [5] => 4550
            [6] => 444
        )
...

など、データベースであるかのように見ると、最も外側の配列の要素が行で、内側の配列の要素が列であると思います。

その情報をファイルに保存して、後で取得できるようにしたいのですが、スペースを節約するためにバイナリデータとして保存したいと思います。基本的に、例から最初の整数を書くと1531412763ファイルに10バイトかかりますが、符号付き整数として保存できれば4バイトになります。

fwriteの使用を提案している他の多くの回答を見てきましたが、そのような方法での使用方法が理解できませんか?

6
php_nub_qq

バイナリデータをファイルに書き込むには、関数 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);
5
Zimmi