rafinos Δημοσ. 24 Ιουλίου 2017 Δημοσ. 24 Ιουλίου 2017 Καλησπέρα παιδιά! Έχω ένα JSON της παρακάτω μορφής: { "categories": [ { "title": "rafa", "link": "rafa", "information": "rafa" }, { "title": "rafa1", "link": "rafa1", "information": "rafa1" } ] } Ας πούμε πως θέλω να διορθώσω κάποια στοιχεία σε ένα από τα αντικείμενα του JSON. Μέσω μιας φόρμας στέλνω τα στοιχεία στο παρακάτω php <?php $str = file_get_contents("categories.json"); $json = json_decode($str, true); foreach($json["categories"] as $key => $value){ foreach($json["categories"][$key] as $key2 => $value2){ if($key2 === "title" && $value2 === $_POST["edit_title"]){ $final_key = $key; } } } if(isset($final_key)){ $array["categories"][$final_key] = array( "title" => $_POST["edit_title"], "link" => $_POST["edit_link"], "information" => htmlspecialchars($_POST["edit_information"], ENT_QUOTES, "UTF-8"), ); if(file_put_contents("categories.json",json_encode($array,JSON_PRETTY_PRINT))){ echo true; } } ?> Τα στοιχεία που έστειλα τα διορθώνει απλά εξαφανίζονται όλα τα υπόλοιπα στοιχεία και το JSON γίνεται σαν το παρακάτω: { "categories": { "1": { "title": "rafa1", "link": "rafa1", "information": "rafa1", } } } Θαρρώ πως το "1" είναι γιατί έγινε η αλλαγή στο δεύτερο στοιχείο, αλλά για πιο λόγο εξαφανίζονται όλα τα υπόλοιπα στοιχεία και εμφανίζεται και το index; 1
defacer Δημοσ. 24 Ιουλίου 2017 Δημοσ. 24 Ιουλίου 2017 Πραγματικά δε μπορώ να καταλάβω τι σκεφτόσουν. 1. Το διπλό foreach έτσι που το έχεις είναι λίγο καγκουριά. Πρώτον, γιατί το εσωτερικό κάνει iterate στο $json["categories"][$key] ενώ την ίδια τιμή ακριβώς την έχεις έτοιμη ως $value? Και γιατί κάνει iterate όλα τα properties της κάθε κατηγορίας ενώ ξέρεις από πριν ότι μόνο το title σε ενδιαφέρει; Δεν καταλαβαίνω το λόγο ύπαρξης του εσωτερικού. 2. Προφανώς εξαφανίζονται όλα τα υπόλοιπα αφού πας και γράφεις το αποτέλεσμά σου στην $array που ως undefined θα συμπεριφερθεί έτσι σαν άδειος πίνακας (που θα πάρει ένα μόνο στοιχείο) και όχι στη $json... 3. Το index εμφανίζεται γιατί το $array έγινε encode σαν object και όχι σα πίνακας. Και αυτό με τη σειρά του έγινε γιατί, διάβασε στην json_encode πώς κάνει encode τους πίνακες.
rafinos Δημοσ. 24 Ιουλίου 2017 Μέλος Δημοσ. 24 Ιουλίου 2017 (επεξεργασμένο) Κοίτα... μάλλον έχει σταματήσει να λειτουργεί ο εγκέφαλός μου. Άντε όλα τα άλλα με τα foreach κτλ, αλλά να περνάω σε άσχετο variable τις τιμές; Χθες με τα λάθος ονόματα, σήμερα αυτό... τραγικός! Να και ο σωστός κώδικας! <?php $str = file_get_contents("categories.json"); $json = json_decode($str, true); foreach($json["categories"] as $key => $value){ if($value["title"] === $_POST["edit_title"]){ $final_key = $key; } } if(isset($final_key)){ $json["categories"][$final_key] = array( "title" => $_POST["edit_title"], "link" => $_POST["edit_link"], "information" => $_POST["edit_information"] ); if(file_put_contents("categories.json",json_encode($json,JSON_PRETTY_PRINT))){ echo true; } } ?> 4596 μηνύματα ο Defacer μέχρι αυτή τη στιγμή και τα 4500 είναι για να με βοηθήσει! Thank you again master Jedi! Η λύση που προτείνουν εδώ πέρα σχετικά με την εμφάνιση του index: https://stackoverflow.com/questions/11195692/json-encode-sparse-php-array-as-json-array-not-json-object είναι σωστή; Ρωτάω γιατί έχω και θέμα με το unset() Οκ δουλεύει και αυτό. Επεξ/σία 25 Ιουλίου 2017 από rafinos
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα