Diskuze: JSON decode -problém
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 30 zpráv z 30.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
A zkoušel jsi
$neco['uzivateldata'][1]['uzivatel_data_typ']
?
mmchdm. máš ten string vůbec dekódovaný?
Ahoj, bohužel to co potřebuji vypsat se nenachází na prvním místě, a ani ten json neovlivním. Takže to nejde jak jsi napsal.
Malá poznámka : v PHP se pole indexují od nuly (a ve všech ostatních programovacích jazycích taky) + podruhé se ptám : máš ten JSON dekódovaný?
Ano mám, ale chápeš já potřebuji vypsat jen data kde se uzivatel_data_typ = vip.II.
Tak to projeď cyklem, nebo pokud nepotřebuješ zrovna JSON, tak si to hoď do DB
A nebo můžeš použít PHPLinq http://phplinq.codeplex.com
A nejde to nějak normálně ?
Ne, leda cyklem, ale při více záznamech to udělá s výkonem nehezké věci.
To vážně není nic, v php kde by to šlo udělat nějak dobře ?
A ten PHPLinq vypadá zajímavě, dá se dobře použít ?
Jo, párkrát jsem ho použil pro podobné účely. Však uvidíš jak ti sedne, ale je jednoduchý na použití.
Zkus něco takovýho:
$data = json_decode($jsonString);
$dataUzivatel = array_column($data["uzivateldata"], "uzivatel_data_typ");
if (in_array("vip.II", $dataUzivatel)) {
// v poli je vip.II
}
Nemám u sebe novější PHP verzi, která podporuje funkci array_column(), takže to neotestuji, ale mohlo by to fungovat.
Super díky, ale jak prak vypíši ty hodnoty co jsou v uzivatel_data_typ
Joo tak to pak bez toho cyklu asi nepůjde. Nenapadá mě jiný způsob, jak zjistit číslo klíče daného záznamu.
Teď jsem si vzpomněl na funkci array_search().
Zkoušel jsem tento script a vypsalo mi to 2:
$array = array(
"uzivateldata" => array(
array(
"typ" => "a",
"var" => 1
),
array(
"typ" => "b",
"var" => 2
),
array(
"typ" => "c",
"var" => 3
)
)
);
$data = array_column($array["uzivateldata"], "typ");
$key = array_search("b", $data);
echo $array["uzivateldata"][$key]["var"];
Takže by to v podstatě šlo i bez cyklu ?
Ano, za své poněkud neohrabané řešení se omlouvám
Ty funkce uvnitř také určitě nějaké cykly dělají, ale pokud ti takové řešení stačí, tak je nemusíš psát sám.
Nebo lze pouzit funkci array_filter:
function filterData($var) {
return $var->uzivatel_data_typ == "vip.II";
}
$json = '{
"uzivateldata": [
{
"uzivatel_data_typ": "vip.II"
},
{
"uzivatel_data_typ": "vip"
},
{
"uzivatel_data_typ": "vip.II"
}
]}';
$data = json_decode($json);
$array = array_filter($data->uzivateldata, "filterData");
print_r($array);
"uzivateldata": [
{
"uzivatel_data_typ": "mapa",
"aggregatedStats": {
"kill": 24,
"asist": 62,
"umrti": 2
},
},
{
"uzivatel_data_typ": "mapa2",
"aggregatedStats": {
"kill": 10,
"asist": 20,
"umrti": 2
},
},
{
"uzivatel_data_typ": "mapa3",
"aggregatedStats": {
"kill": 20,
"asist": 10,
"umrti": 2
},
}
]}';
a potřebuji vypsal u mapa3 kill, ale problém je že třeba další uživatel může mít mapa4 což už by nešlo.
Chapu dobre, ze potrebujes vypsat pocet kill u vsech uzivatelu na mape3?
Moje reseni ti vrati pole objektu, ktere obashuji mapa3. Pak uz si je staci jen v cyklu projet a ziskat pozadovane hodnoty:
foreach ($array as $data) {
echo $data->aggregatedStats->kill;
}
Sorry, je to na 100% funkční měl jsem špatně proměnou. Děkuji za radu
moc
Zobrazeno 30 zpráv z 30.