#php #json #parsing
#php #json #синтаксический анализ
Вопрос:
Я пытаюсь проанализировать файл JSON, который выглядит следующим образом,
[
{
"id": "539eebdba276db40a4716726",
"name": "Development Task",
"idList": "539eebbb4e9a8d709704b254",
"desc": "",
"url": ""
},
{
"id": "539eebe09b42c971d46b9ba1",
"name": "Design Task",
"idList": "539eebbe50dc4fa2a82474fc",
"desc": "",
"url": ""
}
]
Я пытаюсь получить desc
объект из массива с именем Development Task
, система должна быть динамической, поэтому я не могу просто использовать json_o[0](desc);
Я пробовал разные методы, такие как предварительный просмотр данных несколько раз, но я все еще не могу придумать решение, любая помощь была бы отличной, приветствия.
Комментарии:
1. Вы должны получить такое
$json_o[0]['desc'];
после декодирования$json_o = json_decode($jsonstring, true);
2. @Bora, как вы можете сказать, это первый элемент массива, и к нему можно получить доступ через 0-й индекс, как четко указано в OP
the system needs to be dynamic so I can't just use json_o[0](desc);
Ответ №1:
Попробуйте с этим:
$jsonData = '[
{
"id": "539eebdba276db40a4716726",
"name": "Development Task",
"idList": "539eebbb4e9a8d709704b254",
"desc": "",
"url": ""
},
{
"id": "539eebe09b42c971d46b9ba1",
"name": "Design Task",
"idList": "539eebbe50dc4fa2a82474fc",
"desc": "",
"url": ""
}
]';
$encoded = json_decode($jsonData);
foreach($encoded as $data)
{
if('Development Task' == $data->name)
{
echo $data->desc;
}
}
Комментарии:
1. Закрыть, но он запрашивает
desc
из первой записи, а не итерацию2. Только что отредактировано 🙂 проверьте обновление и спасибо, что указали. Я не заметил, OP нужно описание, где имя
Development Task
.3. @Machavity amp; @Bora, да, я понял вашу точку зрения, но OP нужно описание, где name
Development Task
, а код OP является динамическим, и OP даже не знает, будет ли это первым элементом массива или последним :). Вот почему мы должны иметь цикл и проверять, где находится nameDevelopment Task
.
Ответ №2:
Если вы ищете динамические поля, я бы выбрал :
$jsonData = '[
{
"id": "539eebdba276db40a4716726",
"name": "Development Task",
"idList": "539eebbb4e9a8d709704b254",
"desc": "FirstDescription",
"url": ""
},
{
"id": "539eebe09b42c971d46b9ba1",
"name": "Design Task",
"idList": "539eebbe50dc4fa2a82474fc",
"desc": "SecondDescription",
"url": ""
}
]';
$arrayFromJson = json_decode($jsonData, true);
function searchByKey($keyToSearchIn, $searchName, $array) {
foreach ($array as $key => $val) {
if ($val[$keyToSearchIn] == $searchName) {
return $val['desc'];
}
}
return null;
}
$return = searchByKey("name", "Development Task", $arrayFromJson);
Итак
var_dump($return);
ВОЗВРАТ
string(16) "FirstDescription"
Примечание: Если вам нужен только поиск по имени, вы можете изменить функцию с помощью :
function searchByName( $searchName, $array) {
foreach ($array as $key => $val) {
if ($val['name'] == $searchName) {
return $val['desc'];
}
}
return null;
}
$return = searchByName("Development Task", $arrayFromJson);
Надеюсь, это поможет.
Ответ №3:
Комментарии в коде объясняют, что происходит:
$jsonData = '[
{
"id": "539eebdba276db40a4716726",
"name": "Development Task",
"idList": "539eebbb4e9a8d709704b254",
"desc": "moocow",
"url": ""
},
{
"id": "539eebe09b42c971d46b9ba1",
"name": "Design Task",
"idList": "539eebbe50dc4fa2a82474fc",
"desc": "wowcow",
"url": ""
},
{
"id": "539eebe09rb42c971d46b9ba1",
"name": "Development Task",
"idList": "539eebbe50dc4fa2a82474fc",
"desc": "sowccow",
"url": ""
}
]';
$encoded = json_decode($jsonData, true); //converts the json object to an array
foreach ($encoded as $arrayObject){
if( in_array("Development Task", $arrayObject) ){
print_r($arrayObject['desc'] . "n");
}
}
-> moocow sowccow
на основе
Я пытаюсь получить объект desc из массива с именем Задача разработки
Это должно делать то, что вы хотите, и вы можете легко взять строку и сделать ее переменной. Существует множество встроенных функций на PHP.net которые настроены и, вероятно, в 10 раз лучше, чем ваш собственный код.
Комментарии:
1. imo и ‘nitpicking’, ‘in_array’ было бы немного понятнее относительно того, что требуется от теста, поскольку требуется только наличие значения. т.е. if (in_array( «Задача разработки», $ArrayObject)) {
2. Ах, это правда, и мне не нужно было бы явно проверять наличие T / F.