Autor Zpráva
jenad
Profil
Hezký den,

přes googlování se mi nedaří zjistit, jak v php "dekódovat" informace, jež získám přes rozhraní a api z jiné stránky.

        <?php       
        $pokus = file_get_contents( "http://api.worldoftanks.eu/2.0/account/info/?application_id=d0a293dc77667c9328783d489c8cef73&account_id=506772143");
        echo   $pokus;
        ?>


Do proměnné $pokus si naleju informace z uvedené stránky, ale potřeboval bych ji rozkouskovat dle jednotlivých polí a proměnných a to se mně nedaří. Můžete mně prosím pomoci a uvést vzor s kódy, kdy z uvedených dat vytvořím na svých www stránkách tabulku a jak třeba z uvedených dat vyselectuji hodnotu "nickname"?
Medvídek
Profil
jenad:
Data jsou v JSONu, zkus json_decode
jenad
Profil
Díky za tak rychlou reakci, ale budu asi potřebovat silněji nakopnout. Uvedenou stránku jsem už několikrát navštívil, a teď po Tvém upozornění jsem došel k přesnější definici mého problému.

Ze stránky se mně vrátí následující dat:
{"status":"ok","count":1,"data":{"506772143":{"clan":{"role_i18n":"Deputy Commander","clan_id":500022349,"role":"vice_leader","since":1384793865},"achievements":{"tank_expert_uk":1,"medal_dumitru":2,"invader":53,"medal_lehvaslaiho":1,"warrior":217,"medal_halonen":8,"medal_pascucci":17,"medal_orlik":0,"medal_brothers_in_arms":15,"mousebane":1,"tank_expert_france":1,"mechanic_engineer_ussr":0,"medal_bruno_pietro":0,"medal_delanglade":1,"lucky_devil":9,"defender":19,"armor_piercer":1,"medal_kay":1,"supporter":176,"mechanic_engineer":0,"steelwall":143,"max_sniper_series":84,"medal_knispel":1,"medal_boelter":0,"medal_ekins":1,"medal_heroes_of_rassenay":0,"medal_tamada_yoshio":0,"tank_expert_usa":1,"mechanic_engineer_germany":0,"max_piercing_series":40,"tank_expert":0,"iron_man":52,"medal_radley_walters":6,"kamikaze":13,"tank_expert_germany":1,"beasthunter":8,"sniper":243,"medal_tarczay":0,"medal_lavrinenko":2,"mechanic_engineer_france":0,"medal_oskin":0,"medal_burda":0,"medal_billotte":0,"huntsman":1,"hand_of_death":1,"medal_fadin":2,"medal_lafayette_pool":0,"max_killing_series":9,"tank_expert_china":1,"mechanic_engineer_usa":0,"medal_kolobanov":0,"patton_valley":0,"bombardier":2,"medal_abrams":2,"max_invincible_series":5,"medal_poppel":1,"medal_crucial_contribution":1,"raider":2,"max_diehard_series":6,"mechanic_engineer_uk":0,"invincible":1,"lumberjack":0,"sturdy":66,"title_sniper":1,"sinai":9,"diehard":0,"medal_carius":1,"medal_le_clerc":1,"tank_expert_ussr":1,"evileye":93,"mechanic_engineer_china":0,"medal_nikolas":0,"scout":99},"statistics":{"clan":{"spotted":234,"hits":393,"battle_avg_xp":291,"draws":4,"wins":29,"losses":76,"capture_points":92,"battles":109,"damage_dealt":155960,"hits_percents":61,"damage_received":136171,"shots":642,"xp":31707,"frags":57,"survived_battles":30,"dropped_capture_points":81},"all":{"spotted":38552,"hits":96488,"battle_avg_xp":446,"draws":200,"wins":9674,"losses":8943,"capture_points":31382,"battles":18817,"damage_dealt":16137046,"hits_percents":58,"damage_received":15113298,"shots":165197,"xp":8391562,"frags":17819,"survived_battles":3295,"dropped_capture_points":8600},"company":{"spotted":104,"hits":180,"battle_avg_xp":359,"draws":0,"wins":35,"losses":43,"capture_points":116,"battles":78,"damage_dealt":59001,"hits_percents":55,"damage_received":54631,"shots":328,"xp":28011,"frags":45,"survived_battles":20,"dropped_capture_points":39},"max_xp":2553},"account_id":506772143,"created_at":1354447472,"updated_at":1392149898,"private":null,"nickname":"jenad2"}}}

kódem:
        <?php       
        $pokus = file_get_contents( "http://api.worldoftanks.eu/2.0/account/info/?application_id=d0a293dc77667c9328783d489c8cef73&account_id=506772143");// put your code here
        echo   $pokus;
        $json = $pokus;
        $obj = json_decode($json);
        print $obj->{'count'}; //(nebo status)
        ?>

si mohu šáhnout na tučně vybarvená data, ale zatím jsem nedošel k tomu jakou syntaxi příkazu mám použít "na vnořená data" typu např. "nickname". Nějak se mi to z daného odkazu nedaří spatlat, aby mně například u toho nickname vrátil hodnotu: jenad2.
Medvídek
Profil
jenad:
Záleží, jak se ti bude lépe pracovat s výsledky. Jestli jako s objektem, nebo vícerozměrnym polem. Pokud chceš strukturu převést na pole, použij druhý parametr funkce json_decode($json, true);
$obj = json_decode($json, true);
echo $obj["data"][506772143]["nickname"]; // vysledek jenad2
juriad
Profil
print $obj->data->{'506772143'}->nickname;

Mimochodem následující je shodné:
$obj->data # obvykle se používá toto
$obj->{'data'} # pokud název obsahuje něco nepatřičného
jenad
Profil
Ahoj, ještě bych potřeboval poradit s tímto, vrací se mi hodnoty ve tvaru:
{"status":"ok","count":1,"data":{"506772143":[{"statistics":{"wins":2603,"battles":4344},"mark_of_mastery":4,"tank_id":6913},{"statistics":{"wins":1330,"battles":2821},"mark_of_mastery":4,"tank_id":49},{"statistics":{"wins":1022,"battles":1866},"mark_of_mastery":4,"tank_id":54785},{"statistics":,{"statistics":{"wins":31,"battles":65},"mark_of_mastery":2,"tank_id":7681},{"statistics":{"wins":27,"battles":52},"mark_of_mastery":3,"tank_id":5121},{"statistics":{"wins":16,"battles":49},"mark_of_mastery":4,"tank_id":2881},{"statistics":{"wins":24,"battles":44},"mark_of_mastery":3,"tank_id":5169},{"statistics":{"wins":15,"battles":41},"mark_of_mastery":3,"tank_id":6673},{"statistics":{"wins":8,"battles":25},"mark_of_mastery":1,"tank_id":1553},{"statistics":{"statistics":{"wins":0,"battles":1},"mark_of_mastery":0,"tank_id":54801}]}}

Poradíte mi prosím kod, jež jednak vypíše hodnoty wins, battles mark_of_mastery dle zadané hodnoty tank_id a kod, jež mi naopak vypíše vše v tabulce?

Nějak googlováním na to nemohu přijít.

Děkuji
Alphard
Profil
jenad:
Příspěvky [#4], [#5] poskytují přesný návod, jak na první část.

Chtěl jsem se konkrétněji podívat na to vypsání všeho, ale uvedený string není JSON validní, nelze s ním pracovat.
jenad
Profil
Alphard:
Díky za reakci, myslím si to taky, ale jaksi se mi nedaří dát dohromady odkaz. Skusil jsem několik variant a pořád to háže chybu. Mohl bys poradit co mám v kodu špatně?

       <?php       
        $pokus = file_get_contents( "http://api.worldoftanks.eu/2.0/account/tanks/?application_id=d0a293dc77667c9328783d489c8cef73&account_id=506772143");
        $json = $pokus;
        $obj = json_decode($json);

        $obj = json_decode($json, true);
        echo $obj["data"][506772143]["statistics"]["tank_id"][6913]["mark_of_mastery"]; 
        
        ?>


Jinak máš pravdu ten předchozí výpis jsem sesekal, je dlouhý. Proto pokud budeš moci viz odkaz výše.

Předem dík za nápovědu.
Alphard
Profil
$arr = json_decode($json, true);
var_dump($arr);

$tankId = false; // vsechny vysledky
$tankId = 49; // konkretni

foreach ($arr['data'][506772143] as $item)
{
    if (!$tankId || $item['tank_id'] == $tankId)
    {
        echo $item['statistics']['wins'], $item['statistics']['battles'], $item['mark_of_mastery'];
    }
}
jenad
Profil
Alphard:
Díky moc. Hlavně za přidaný způsob řešení s podmínkou. Hodně mně to pomohlo a posunulo o dost dál v chápaní php a API.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: