Ниже код, который выдает такую ошибку:
Warning: unpack(): Type I: not enough input, need 4, have 1
Т.е. не срабатывает ф-я feof. Хотя достигнув конца файла она должна остановить цикл. Возможно, при записи бинарного файла нужно самому записывать и символ EOF?
//id,login,email,phone
$users = [
[1, 'user1', '[email protected]', 786214569851],
[2, 'user2', '[email protected]', 786214569852],
[3, 'user3', '[email protected]', 786214569853],
];
$bin = '';
foreach ($users as $values) {
list($id, $login, $email, $phone) = $values;
$loginLength = strlen($login);
$emailLength = strlen($email);
$bin .= pack("I2a{$loginLength}Ia{$emailLength}I", $id, $loginLength, $login, $emailLength, $email, $phone);
}
$handle = fopen('users.bin', 'wb');
fwrite($handle, $bin);
fclose($handle);
//———————
$users = [];
$handle = fopen('users.bin', 'rb');
while(!feof($handle)) {
$data = fread($handle, 4);
$data = unpack('Iid', $data);
$result['id'] = $data['id'];
$data = fread($handle, 4);
$data = unpack('Ilength', $data);
$loginLength = $data['length'];
$data = fread($handle, $loginLength);
$data = unpack('a*login', $data);
$result['login'] = $data['login'];
$data = fread($handle, 4);
$data = unpack('Ilength', $data);
$emailLength = $data['length'];
$data = fread($handle, $emailLength);
$data = unpack('a*email', $data);
$result['email'] = $data['email'];
$data = fread($handle, 4);
$data = unpack('Iphone', $data);
$result['phone'] = $phone;
$users[] = $result;
}
fclose($handle);
print_r($users);
die;