File, JSON & Tanggal

Membaca/menulis file, CSV, JSON (json_encode/decode dengan JSON_THROW_ON_ERROR), DateTimeImmutable, zona waktu, dan generator.

Part 15 dari 22 ± 45 menit Gratis

Membaca dan menulis file

// cara cepat
$isi = file_get_contents(__DIR__ . '/data.txt');            // string, atau false jika gagal
file_put_contents(__DIR__ . '/log.txt', "baris\n", FILE_APPEND | LOCK_EX);

$baris = file(__DIR__ . '/data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // array baris

// aman untuk file besar: baca per baris
$h = fopen(__DIR__ . '/besar.txt', 'r');
if ($h === false) {
    throw new RuntimeException('Tidak bisa membuka file');
}
while (($line = fgets($h)) !== false) {
    // proses $line
}
fclose($h);

Selalu cek false dari fungsi file, gunakan __DIR__ agar path tidak bergantung folder kerja, file_exists() / is_readable() untuk memeriksa, dan LOCK_EX agar dua proses tidak saling menimpa. Jangan pernah membangun path dari input pengguna tanpa memvalidasi (bahaya path traversal ../../etc/passwd): pakai basename() dan daftar putih.

CSV

$h = fopen('produk.csv', 'r');
while (($row = fgetcsv($h)) !== false) {
    [$nama, $harga] = $row;
}
fclose($h);
fputcsv($out, ['Mouse', 75000]);   // menulis dengan escaping yang benar

JSON

$data = ['nama' => 'Sari', 'hobi' => ['membaca', 'coding'], 'aktif' => true];

$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);

$kembali = json_decode($json, associative: true, flags: JSON_THROW_ON_ERROR);

try {
    json_decode('{rusak', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
    echo 'JSON tidak valid: ' . $e->getMessage();
}

Tanpa JSON_THROW_ON_ERROR, kegagalan hanya menghasilkan null/false dan mudah terlewat. Dengan flag itu PHP melempar JsonException. Pakai json_validate() (8.3) untuk sekadar mengecek. Mengirim JSON dari skrip web:

header('Content-Type: application/json; charset=utf-8');
http_response_code(200);
echo json_encode(['ok' => true], JSON_THROW_ON_ERROR);

Objek yang ingin di-encode bisa mengimplementasikan JsonSerializable (method jsonSerialize(): mixed) untuk mengatur bentuk keluarannya.

Tanggal & waktu

Gunakan DateTimeImmutable — tidak berubah saat dimodifikasi, sehingga bebas dari bug "tanggal ikut berubah di tempat lain".

date_default_timezone_set('Asia/Jakarta');

$sekarang = new DateTimeImmutable();
$besok    = $sekarang->modify('+1 day');
$tgl      = new DateTimeImmutable('2026-10-16 08:30:00');

echo $tgl->format('d/m/Y H:i');          // 16/10/2026 08:30
echo $tgl->add(new DateInterval('P7D'))->format('Y-m-d');   // 2026-10-23

$selisih = (new DateTimeImmutable('2026-01-01'))->diff($tgl);
echo $selisih->days;                      // jumlah hari

$utc = $tgl->setTimezone(new DateTimeZone('UTC'));

Praktik baik: simpan waktu di database dalam UTC, tampilkan dalam zona pengguna. Format ISO 8601 ($d->format(DATE_ATOM)) untuk API. Hindari strtotime() dan date() bila butuh perhitungan yang rumit atau zona waktu.

Generator — hemat memori

function barisCsv(string $path): Generator
{
    $h = fopen($path, 'r');
    try {
        while (($row = fgetcsv($h)) !== false) {
            yield $row;                 // kirim satu baris, jeda, lanjut saat diminta
        }
    } finally {
        fclose($h);
    }
}

foreach (barisCsv('besar.csv') as $row) { /* hanya 1 baris di memori */ }

File berjuta baris bisa diproses dengan memori nyaris konstan karena yield menghasilkan nilai satu per satu.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X