【问题标题】:Filtering JSON Object and outputting another过滤 JSON 对象并输出另一个
【发布时间】:2014-08-07 10:45:50
【问题描述】:

我正在尝试解析一个看起来像这样的 JSON 文件,

[
    {
        "id": "539eebdba276db40a4716726",
        "name": "Development Task",
        "idList": "539eebbb4e9a8d709704b254",
        "desc": "",
        "url": ""
    },
    {
        "id": "539eebe09b42c971d46b9ba1",
        "name": "Design Task",
        "idList": "539eebbe50dc4fa2a82474fc",
        "desc": "",
        "url": ""
    }
]

我正在尝试从名为Development Task 的数组中获取desc 对象,系统需要是动态的,所以我不能只使用json_o[0](desc);

我尝试了不同的方法,例如多次查询数据,但我仍然想不出解决方案,任何帮助都会很棒,干杯。

【问题讨论】:

  • 解码$json_o = json_decode($jsonstring, true);后你应该得到这样的$json_o[0]['desc'];
  • @Bora,怎么说呢,它是数组的第一个元素,可以通过第0个索引访问,正如OP明确提到的the system needs to be dynamic so I can't just use json_o[0](desc);

标签: php json parsing


【解决方案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;
        }
}

【讨论】:

  • 关闭,但他从第一条记录中要求desc,而不是迭代
  • 刚刚编辑 :) 检查更新并感谢您的指点。我没注意到,OP 需要名称为Development Task 的描述。
  • @Machavity & @Bora,是的,明白了你的意思,但是 OP 需要描述,其中名称是 Development Task 并且 OP 的代码是动态的,OP 甚至不知道它是否会是第一个元素数组或最后一个:)。这就是为什么我们必须有一个循环并检查名称在哪里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】:

    代码中的 cmets 解释了发生了什么:

        $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 
    

    基于

    我正在尝试从名为 Development Task 的数组中获取 desc 对象

    这应该可以满足您的需求,并且您可以轻松地获取字符串并将其设为变量。 PHP.net 上有很多内置函数经过调整,可能比编写自己的代码好 10 倍。

    【讨论】:

    • imo 和 'nitpicking', 'in_array' 对于测试所需的内容会稍微清楚一些,因为只需要存在值。即 if (in_array("Development Task", $arrayObject)) {
    • 啊,这是真的,我不需要明确检查 T/F。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2019-09-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多