PHP - 获取Json中key的值

时间:2016-03-01 19:44:08

标签: php json

我正在使用Behat,PHP和Guzzle进行一些测试来发出HTTP请求。我的一个请求给了我这个Json回复机构:

   {  
       "products":[  
          {  
             "id":1466367,
             "sku":"PO870SHB32LET",
             "name":"T\u00eanis Polo Ralph Lauren Kids Day Bege",
             "brand_id":20901,
             "brand":"Polo Ralph Lauren Kids",
             "description":"test test test abc",
             "price":124.9,
             "original_price":179,
             "gender":[  
                "menino",
                "masculino"
             ]
          }
       ]
    }

所以,我使这个函数得到了值:

    public function getJsonFieldValue($keyword)
    {
        $responseBody = $this->getResponse()->json();
        $jsonFieldValue = $this->recursiveFieldKeySearch($keyword,$responseBody);        
    }

    public function recursiveFieldKeySearch($needle,$haystack) {
            foreach($haystack as $key=>$value)
            {
                $current_key = $key;
                if(!is_array($value) && $needle===$key) {
                    return $value;
                }

                if (is_array($value)) {
                   return self::recursiveFieldKeySearch($needle,$value);
                }
            }
            return false;
        }

例如,如果值为“id”,则函数可以查找并返回该值。问题是当我想获得“性别”的值时,我的函数总是为我返回FALSE。有人可以帮帮我吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

认为你应该改变这行代码。基本上如果针是阵列返回它。

if (is_array($value)) {
    return self::recursiveFieldKeySearch($needle,$value);
}

if (is_array($value) && $needle === $key) {
    return $value;
} else if (is_array($value)) {
    return self::recursiveFieldKeySearch($needle,$value);
}

@trincot的附录

您的算法有些值不正确。

示例

{
    "products":[
        {  "a":1  },
        {  
           "id":1466367,
           ...etc.
        }
    ]
}

此处您的算法无法找到ID。

更好的算法

public function recursiveFieldKeySearch($needle, $haystack) {
    if (!is_array($haystack))      return false;
    if (isset($haystack[$needle])) return $haystack[$needle];

    foreach ($haystack as $key=>$value) {
        $result = self::recursiveFieldKeySearch($needle, $value);
        if ($result !== false) return $result;
    }
    return false;
}

感谢@trincot的附录

答案 1 :(得分:0)

代码存在更多问题。例如,如果您有两个兄弟阵列,而密钥位于第二个,那么您的代码将无法找到它。

示例:

如果在您的JSON字符串中,您会添加{ "a":1 },作为" products" 的第一个元素,如下所示:

{
    "products":[
        {  "a":1  },
        {  
           "id":1466367,
           ...etc.
        }
    ]
}

然后使用您的代码,您将找不到" id" 。这是因为在获取" products" 的第二个数组元素之前,函数将以false退出。

<强>解决方案

请改为尝试:

public function recursiveFieldKeySearch($needle, $haystack) {
    if (!is_array($haystack))      return false;
    if (isset($haystack[$needle])) return $haystack[$needle];

    foreach ($haystack as $key=>$value) {
        $result = self::recursiveFieldKeySearch($needle, $value);
        if ($result !== false) return $result;
    }
    return false;
}