我正在使用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。有人可以帮帮我吗?
谢谢!
答案 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;
}