Spara data som JSON
JSON gör det enkelt att spara arrayer i en fil och läsa tillbaka dem med strukturen i behåll.
Varför JSON?
En textfil med en rad per post fungerar för enkla listor. Men så fort varje post har flera värden, som en todo med text, status och datum, blir det krångligt. JSON är ett textformat som kan beskriva arrayer med nycklar och värden, och det känner du igen från JavaScript.
| Steg | Funktion |
|---|---|
| Array → JSON-text | json_encode($data, $flaggor) |
| JSON-text → fil | file_put_contents($sokvag, $json) |
| Fil → JSON-text | file_get_contents($sokvag) |
| JSON-text → associativ array | json_decode($json, true) |
| JSON-text → objekt | json_decode($json) |
Spara
Flaggorna gör filen lättare att läsa:
JSON_PRETTY_PRINTlägger till radbrytningar och indrag.JSON_UNESCAPED_UNICODEsparar å, ä och ö som de är i stället för som koder.
Flera flaggor kombineras med |.
Läsa, ändra och spara igen
Det andra värdet true till json_decode() gör att du får associativa arrayer. Utan det får du objekt, och skriver då $todo->text i stället för $todo["text"].
När filen saknas eller är trasig
json_decode() returnerar null om texten inte är giltig JSON. Ett säkert sätt att läsa in är:
$todos = [];
if (file_exists("todo.json")) {
$todos = json_decode(file_get_contents("todo.json"), true) ?? [];
}
Hämta JSON via http
file_get_contents() kan också hämta från en webbadress:
$response = file_get_contents("http://localhost:8000/todo.json");
Gör inte så mot din egen php -S-server. Den inbyggda servern hanterar bara ett anrop i taget, så sidan väntar på ett svar som servern inte kan ge förrän sidan är klar. Läs filen direkt från disken i stället. På en riktig webbserver, som klarar parallella anrop, fungerar det.
Prova själv
- Lägg till ett fält
"prio"på varje todo och skriv ut det. - Skriv ut hur många todos som är klara och hur många som återstår.
- Ta bort flaggan
JSON_UNESCAPED_UNICODE. Hur ser “mjölk” ut i JSON-texten?
Det här mönstret, läsa in, ändra och spara tillbaka, använder du i gästboken, todo-applikationen och inlämningsuppgiften.