如何更新JSON元素

时间:2013-03-05 18:13:28

标签: php json

我有一个来自Joomla的CCK的JSON文件。我需要更新文件中包含的评级元素,因为该网站将从使用5星评级到10星评级。这意味着所有评级都必须乘以2.

我可以这样做:

<?php

$file = "file.txt";
$json = json_decode(file_get_contents($file));

$i = 1;
foreach($json->items as $element){

    foreach($element->elements as $item) {
        if ($item->type == "rating") {

            // Now I have the values of votes and can multiply with 2
            $newRating = number_format($item->data->value * 2 , 4);

            // Now what?
            // How do I get that value back in the json file, in the correct place?

        }

    }

}

?>

如何将json文件中的值返回到正确的位置?

文件中的完整项目:

"items":  {
    "bergans-rondane-lady-65-liter":  {
        "searchable": "1",
        "state": "1",
        "created": "2012-01-19 10:15:25",
        "modified": "2012-01-19 10:23:27",
        "hits": "1312",
        "access": "1",
        "priority": "0",
        "publish_up": "2012-01-19 10:15:25",
        "publish_down": "0000-00-00 00:00:00",
        "author": "Rasmus Bech",
        "tags":  {
            "0": "Bergans"
        },
        "content": null,
        "metadata":  {
            "description": "",
            "keywords": "",
            "robots": "",
            "author": ""
        },
        "config":  {
            "page_title": "",
            "enable_comments": "1",
            "primary_category": "rygsaekke-og-tasker-2"
        },
        "categories":  {
            "0": "rygsaekke-og-tasker-2"
        },
        "elements":  {
            "11cafcc4-0015-48d5-9da0-5c732e33f212":  {
                "type": "text",
                "name": "M\u00e6rke",
                "data":  {
                    "0":  {
                        "value": ""
                    }
                }
            },
            "b13f8b6a-6dc2-4af9-b297-0839f4aa7c5a":  {
                "type": "text",
                "name": "Model",
                "data":  {
                    "0":  {
                        "value": ""
                    }
                }
            },
            "d3b5ddeb-6122-430b-99e9-f9f068ba7f8e":  {
                "type": "image",
                "name": "Teaserbillede",
                "data":  {
                    "file": "images\/anmeldelser\/bergans_rondane.jpg",
                    "title": "",
                    "link": "",
                    "target": "",
                    "rel": "",
                    "lightbox_image": "",
                    "width": "600",
                    "height": "979"
                }
            },
            "c489f3ed-22ec-44a2-8fa3-597f7065f66e":  {
                "type": "image",
                "name": "Flere billeder 1",
                "data":  {
                    "file": "",
                    "title": "",
                    "link": "",
                    "target": "",
                    "rel": "",
                    "lightbox_image": ""
                }
            },
            "a4df94fe-ba21-4932-947c-1860fda062d3":  {
                "type": "image",
                "name": "Flere billeder 2",
                "data":  {
                    "file": "",
                    "title": "",
                    "link": "",
                    "target": "",
                    "rel": "",
                    "lightbox_image": ""
                }
            },
            "f7bd3bdb-7832-423a-a441-a09e456509fd":  {
                "type": "image",
                "name": "Flere billeder 3",
                "data":  {
                    "file": "",
                    "title": "",
                    "link": "",
                    "target": "",
                    "rel": "",
                    "lightbox_image": ""
                }
            },
            "9bac915e-3edd-4761-9fae-48f11b28a6f7":  {
                "type": "image",
                "name": "Flere billeder 4",
                "data":  {
                    "file": "",
                    "title": "",
                    "link": "",
                    "target": "",
                    "rel": "",
                    "lightbox_image": ""
                }
            },
            "e4431ff2-8237-4b6e-9c7c-a091ef3e5e6b":  {
                "type": "textarea",
                "name": "Anmeldelse",
                "data":  {
                    "0":  {
                        "value": "<p>Testen er et battle mellem Bergans Rondane Lady 65 vs. Lowe TFX Annapurna ND 65:80<\/p>\n<p><em>Den samme test ligger under&nbsp;Lowe TFX Annapurna ND 65:80, hvor du kan se kommentarer og karakterne som er givet til Lowe rygs\u00e6kken.<\/em><\/p>\n<p>For de fleste aktive kvinder er en rygs\u00e6k p\u00e5 60 liter en fast, og vigtig, del af udstyrsarsenalet, og hvad enten den bruges p\u00e5 fjeldturen eller til rygs\u00e6ksrejsen, skal den sidde perfekt og have en indretning, der ikke giver gr\u00e5 h\u00e5r i hovedet. Vi har testet to af markedets mest popul\u00e6re modeller, der overraskende nok viste sig at byde p\u00e5 markante forskelle i b\u00e6rekomfort og betjening.<\/p>\n<p>Selv om rygs\u00e6kke udvikler sig med lige s\u00e5 stor hast som alt andet udstyr, er det de f\u00e6rreste af os, der skifter rygs\u00e6kken ud oftere end hver tiende \u00e5r. S\u00e5 er det ved at v\u00e6re l\u00e6nge siden du investerede i din trofaste slider, vil du sandsynligvis blive overrasket over, hvor meget der faktisk er sket p\u00e5 udviklingen af rygs\u00e6kke.<\/p>\n<p>I forbindelse med vores test har vi kigget n\u00e6rmere p\u00e5 to popul\u00e6re modeller, nemlig Bergans Rondane Lady 65 og Lowes TFX Annapurna ND65:80, der begge er allround-rygs\u00e6kke i den nogenlunde fornuftige ende af prisskalaen, hvilket for os vil sige 1500-2000 kroner.<br \/>Vi har gennem en cirka fire m\u00e5neder lang testperiode haft rygs\u00e6kkene med to kvinder p\u00e5 ture, der mest har budt p\u00e5 vandring med 15-20 kilos belastning, men s\u00e6kkene har ogs\u00e5 v\u00e6ret en tur i kanoen og v\u00e6ret brugt som decideret rejserygs\u00e6kke.<\/p>\n<p>Vores test viser f\u00f8rst og fremmest, at man faktisk f\u00e5r meget kvalitet for pengene, n\u00e5r man handler rygs\u00e6k i den ovenn\u00e6vnte prisklasse. Kvinde-detajlerne er ogs\u00e5 i orden p\u00e5 begge rygs\u00e6kke, hvilket vil sige at b\u00e6resystemer sidder som de skal, mens hofteb\u00e6lter er korrekt vinklede til kvinders hofter. Andre detaljer, som flot design og god plads til langt h\u00e5r, er der ogs\u00e5 t\u00e6nkt p\u00e5, men vigtigst af alt blev vi bekr\u00e6ftet i, at rygs\u00e6kke sidder vidt forskelligt, og at det ofte kommer an p\u00e5 smag og behag, samt den enkelte rygs anatomi, n\u00e5r det g\u00e6lder det vigtige valg af rygs\u00e6k.<\/p>\n<p>For eksempel viste Bergans-s\u00e6kken sig at sidde virkelig stabilt p\u00e5 ryg og hofter, mens Lowen havde et kontant og mere dynamisk b\u00e6resystem, der tiltalte folk med god balance og hang til h\u00e5rd polstring. Overordnet kan man sige, at Bergans, med sit afstivede og bl\u00f8de b\u00e6resystem, umiddelbart er den, der vil passe p\u00e5 flest forskellige kvinderygge, mens Lowe deler vandene, og kan overraske positivt s\u00e5vel som negativt. Derudover har Bergans den bedst gennemt\u00e6nkte indretning og dermed letteste adgang til indholdet, mens Lowe uden tvivl er den mest solide og materialem\u00e6ssigt gennemf\u00f8rte af de to.<\/p>"
                    }
                }
            },
            "8acbd5df-6584-40e7-84e0-d918373fe7dc":  {
                "type": "textarea",
                "name": "Design",
                "data":  {
                    "0":  {
                        "value": "<p>B\u00e6rekomfort: **** <br \/>Bergans Rondane Lady 65l byder p\u00e5 et klassisk, bl\u00f8dt og velpolstret b\u00e6resystem. Den giver en fornemmelse, der tiltalte samtlige testere, der ogs\u00e5 vendte tommelfingrene opad for et s\u00e6t virkelig velsk\u00e5rne b\u00e6reremme, der sidder som malet p\u00e5 kvinders overkrop og ikke kommer i vejen for armenes bev\u00e6gelser. S\u00e5 l\u00e6nge v\u00e6gten ikke kommer over 20 kilo, f\u00f8lger hofteb\u00e6ltet ogs\u00e5 godt med uden at klappe sammen.<\/p>\n<p><br \/>Indretning:****(*)<br \/>Hoved-featuren i Bergans-rygs\u00e6kken er en k\u00e6mpestor hesteskoformet \u00e5bning, der giver adgang til s\u00e6kkens hovedrum fra fronten. Hvis man er vant til den klassiske opbygning med adgang fra top og bund, kr\u00e6ver systemet lige lidt tilv\u00e6nning, men p\u00e5 tur fungerer det generelt godt, og vi havde ikke st\u00f8rre problemer med at f\u00e5 fat i indholdet, s\u00e5 l\u00e6nge det ikke var pakket for langt ned i bunden Der er god plads i sidelommerne, og topl\u00e5get kan h\u00e6ves, hvilket er fedt n\u00e5r man skal have lidt ekstra plads. Det ses, at der er t\u00e6nkt over tingene, og faktisk savnede vi kun sm\u00e5 lommer p\u00e5 hofteb\u00e6ltet.<\/p>"
                    }
                }
            },
            "b2e7178c-f277-40be-ae5f-332290452beb":  {
                "type": "textarea",
                "name": "Brugervenlighed",
                "data":  {
                    "0":  {
                        "value": "<p>N\u00e5r det g\u00e6lder selve betjeningen og brug af Rondane Lady, har vi kun minimale sm\u00e5ting at uds\u00e6tte p\u00e5 den ellers meget gennemf\u00f8rte rygs\u00e6k, der fungerer mere eller mindre perfekt og fremkaldte tilfredse smil i testpanelet. Rygl\u00e6ngden kan justeres med et snuptag, mens remme, sp\u00e6nder og lynl\u00e5se k\u00f8rer up\u00e5klageligt og tilmed er lette at betjene med vanter p\u00e5.<\/p>"
                    }
                }
            },
            "f146d372-e22f-4f28-bcca-a902ea3306ef":  {
                "type": "textarea",
                "name": "V\u00e6rdi for pengene",
                "data":  {
                    "0":  {
                        "value": ""
                    }
                }
            },
            "cb9a09d6-4de4-4c8b-94ce-82a66f47a69f":  {
                "type": "textarea",
                "name": "Finish",
                "data":  {
                    "0":  {
                        "value": "<p>Der er brugt gode, robuste materialer til Rondane-rygs\u00e6kken, og man f\u00e5r hurtigt indtrykket af en rygs\u00e6k, der ikke kan sl\u00e5s ihjel. Det er en god metervare, der ikke r\u00e5ber alt for h\u00f8jt, og der er ikke brugt resurser p\u00e5 overdrevent luksuri\u00f8se materialer. Vi er lidt skuffede over lynl\u00e5sene, der i forhold til Lowe Annapurna, virker lidt billige og spinkle, men om kraftigere lynl\u00e5se er n\u00f8dvendige, vil kun mange \u00e5rs brug vise.<\/p>"
                    }
                }
            },
            "69b25ccd-8625-4556-a058-dcd994668d1e":  {
                "type": "textarea",
                "name": "Samlet vurdering",
                "data":  {
                    "0":  {
                        "value": "<p>Norsk fornuft n\u00e5r det er bedst \u2013 Bergans Rondane lady 65l er en velsiddende sejtr\u00e6kker med en genial indretning og virkelig nem adgang til indholdet \u2013 i et apsis er det ligefrem en forn\u00f8jelse at skulle finde grej frem. P\u00e5 ryggen sidder s\u00e6kken virkelig godt, men du skal v\u00e6re forberedt p\u00e5 en lidt statisk og fastsp\u00e6ndt fornemmelse, da b\u00e6resystemet ikke f\u00f8lger dine bev\u00e6gelser, hvis du i stejlt terr\u00e6n skal ud i kroppens yderstillinger. Dette er dog ikke noget problem under almindelige forhold. S\u00e6kken har desuden den helt store fordel, at den kan bruges til b\u00e5de fjeldtur og backpacking.<\/p>"
                    }
                }
            },
            "f951e74e-f30c-4f83-b5fd-fe8d90e03f99":  {
                "type": "rating",
                "name": "Design",
                "data":  {
                    "votes": "1",
                    "value": "4.0000"
                }
            },
            "7bb05e07-fbdd-4dee-ade9-ee2082281b52":  {
                "type": "rating",
                "name": "Brugervenlighed",
                "data":  {
                    "votes": "1",
                    "value": "5.0000"
                }
            },
            "4e522fab-0cb5-4342-84d8-518050592150":  {
                "type": "rating",
                "name": "V\u00e6rdi for pengene",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "c0c3ca0f-055d-4dec-bfe6-07c23730d6bc":  {
                "type": "rating",
                "name": "Finish",
                "data":  {
                    "votes": "1",
                    "value": "3.0000"
                }
            },
            "fb3abe5f-7493-4bc7-84b2-b8acd9e34346":  {
                "type": "rating",
                "name": "Samlet vurdering",
                "data":  {
                    "votes": "1",
                    "value": "4.0000"
                }
            },
            "70536a2f-000c-4081-8262-eafcfff8e65d":  {
                "type": "rating",
                "name": "Design (bruger)",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "6492789c-057d-40c3-9342-449c01145c27":  {
                "type": "rating",
                "name": "Brugervenlighed (bruger)",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "8256f96f-57af-411c-ba00-61899225fb56":  {
                "type": "rating",
                "name": "V\u00e6rdi for pengene (bruger)",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "f89f5edd-fafc-4025-818d-e7923eeb3aee":  {
                "type": "rating",
                "name": "Finish (bruger)",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "8a54778d-bd8b-4f4b-90bc-016e50b7d8bc":  {
                "type": "rating",
                "name": "Samlet vurdering (bruger)",
                "data":  {
                    "votes": "",
                    "value": ""
                }
            },
            "ddd92a65-ebe3-482b-890b-0ca9bd1884b4":  {
                "type": "text",
                "name": "Pris",
                "data":  {
                    "0":  {
                        "value": "1599"
                    }
                }
            },
            "8cd2f1b9-6734-4e5b-910e-1f5bf237f0d8":  {
                "type": "link",
                "name": "Link",
                "data":  {
                    "0":  {
                        "value": "http:\/\/www.spejdersport.dk",
                        "text": "",
                        "target": "",
                        "custom_title": "",
                        "rel": ""
                    }
                }
            },
            "f3abcc85-97cc-4e55-a94a-41ea497ffe02":  {
                "type": "socialbookmarks",
                "name": "Sociale netv\u00e6rk",
                "data":  {
                    "value": "1"
                }
            }
        },
        "group": "Anmeldelse af udstyr",
        "name": " Bergans Rondane Lady 65 liter"
    }

3 个答案:

答案 0 :(得分:3)

读入json文件,使用json_decode()将其转换为PHP对象。迭代对象,更改评级,然后json_encode()并将其写回文件。

答案 1 :(得分:0)

如果没有json上的交互,我认为你不能做到这一点,但这个库可能有助于完成该任务

http://jsonselect.org/#overview

答案 2 :(得分:0)

<?php

$file = "file.txt";
$json = json_decode(file_get_contents($file));

$i = 1;
foreach($json->items as $key => $element){

    foreach($element->elements as $key2 => $item) {
        if ($item->type == "rating") {

            // Now I have the values of votes and can multiply with 2
            $newRating = number_format($item->data->value * 2, 4);

            // Now what?
            // How do I get that value back in the json file, in the correct place?
            $json->items->{$key}->elements->{$key2}->data->value = $newRating;

        }
    }
}

// back to a string
$newJson = json_encode($json);

// here you then write back to file with fopen, fwrite and fclose

?>