2016-10-04 2 views
5

내가 정수그대로

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

그리고 데이터베이스 인 것처럼 나는 그것을 보면 등등, 나는 가정의 배열이 이진 데이터는 파일에 기록 - 가장 바깥 쪽 배열의 요소를 행은 내부 배열의 요소는 열입니다.

정보를 파일에 저장하여 나중에 검색 할 수 있지만 공간을 절약하기 위해 이진 데이터로 저장하려고합니다. 기본적으로 예제에서 1531412763의 첫 번째 정수를 파일에 쓰면 10 바이트를 사용하지만 부호있는 정수로 저장할 수 있다면 4 바이트를 차지합니다.

나는 이런 식으로 사용하는 방법을 이해할 수없는 fwrite을 사용하여 제안하는 다른 답변을 많이 보았습니까?

+0

[팩] (http://php.net/manual/en/function.pack.php)? – Zimmi

+0

* 정말 * 공간을 절약 할 필요가 있다면 왜 데이터를 압축하지 않을까요? 이 시점에서 볼 수 있습니다. – Andrew

+0

@Zimmi yeah 그건 정확히 내가 필요로하는 것이지만, 각각의 가치에 대해'pack'을 호출해야합니까, 아니면 더 쉬운 방법이 있습니까? –

답변

3

파일에 이진 데이터를 쓰려면 pack()unpack() 함수를 사용할 수 있습니다. Pack은 바이너리 문자열을 생성합니다. 결과가 문자열이므로 int를 단일 문자열로 연결할 수 있습니다. 그런 다음이 문자열을 파일의 행으로 씁니다.

이렇게하면 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); 
+1

그리고 각 행에 새로운 줄이 필요하지 않은 요소의 수가 정확히 같은 경우에는 행 길이를 2 진수로 변환 한 다음'fread ($ handle, $ length)'로 계산하면됩니다. –

+0

물론입니다! 그리고 마지막 질문에서 제안한 것처럼 형식을 최적화하십시오. – Zimmi

+0

이 방법을 사용하면 일반 텍스트를 저장하는 대신 상당한 공간을 절약 할 수있었습니다. '2.72GB'에서'400MB'까지,'6.8' 시간 단축! –