Фильтрация объекта JSON и вывод другого

#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 даже не знает, будет ли это первым элементом массива или последним :). Вот почему мы должны иметь цикл и проверять, где находится name Development 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.