Мені потрібно отримати елемент з виходу json, проте вміст json не завжди відповідає.
Наприклад, якби я хотів отримати значення для "name", це було б ["result"]["attributes"][0]["name"];
Але у випадку, якщо json буде наданий як другий приклад, це було б ["result"]["attributes"][1]["name"];
{"result":{
"attributes":[
{"user":"newb","name":"mike"},
{"state":"california","city":"los angeles"}
]
}}
{"result":{
"attributes":[
{"state":"california","city":"los angeles"},
{"user":"newb","name":"mike"}
]
}}
Як я можу отримати значення "name", якщо індекс масиву, в якому він невідомий?
Відповіді:
1 для відповіді № 1Це поверне індекс у attributes
масив, який містить об'єкт з a name
атрибут "mike"
.
function extractNameFromJson($json) {
foreach ($json->result->attributes as $i => $attribute) {
if (isset($attribute["name"]) && $attribute["name"] == "mike") {
return $i;
}
}
}
$index = extractNameFromJson($json);
echo $json->result->attributes[$index]["user"];
==> newb
3 для відповіді № 2
var arr = obj.result.attributes;
for (var i=0; i<arr.length; i++)
if ("name" in arr[i])
return arr[i].name;
або, якщо в масиві завжди є лише два об'єкти:
var attrs = obj.result.attributes;
return attrs["name" in attrs[0] ? 0 : 1].name;
Але я б наполягав на зміні цього api, два об'єкти слід просто об'єднати.
EDIT: Вибачте, ось PHP:
$attrs = json_decode($jsonStr, true)["result"]["attributes"];
return $attrs[ isset($attrs[0]["name"]) ? 0 : 1 ];