Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδιά!

 

Έχω ένα 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;

  • Like 1
Δημοσ.

Πραγματικά δε μπορώ να καταλάβω τι σκεφτόσουν.  :-D

 

1. Το διπλό foreach έτσι που το έχεις είναι λίγο καγκουριά. Πρώτον, γιατί το εσωτερικό κάνει iterate στο $json["categories"][$key] ενώ την ίδια τιμή ακριβώς την έχεις έτοιμη ως $value? Και γιατί κάνει iterate όλα τα properties της κάθε κατηγορίας ενώ ξέρεις από πριν ότι μόνο το title σε ενδιαφέρει; Δεν καταλαβαίνω το λόγο ύπαρξης του εσωτερικού.

 

2. Προφανώς εξαφανίζονται όλα τα υπόλοιπα αφού πας και γράφεις το αποτέλεσμά σου στην $array που ως undefined θα συμπεριφερθεί έτσι σαν άδειος πίνακας (που θα πάρει ένα μόνο στοιχείο) και όχι στη $json...  :)

 

3. Το index εμφανίζεται γιατί το $array έγινε encode σαν object και όχι σα πίνακας. Και αυτό με τη σειρά του έγινε γιατί, διάβασε στην json_encode πώς κάνει encode τους πίνακες.

Δημοσ. (επεξεργασμένο)

Κοίτα... μάλλον έχει σταματήσει να λειτουργεί ο εγκέφαλός μου. Άντε όλα τα άλλα με τα foreach κτλ, αλλά να περνάω σε άσχετο variable τις τιμές; :P

 

Χθες με τα λάθος ονόματα, σήμερα αυτό... τραγικός!

 

Να και ο σωστός κώδικας!

<?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() :P

Οκ δουλεύει και αυτό. :P :D

Επεξ/σία από rafinos

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...