Php 查看深嵌套json数组中是否存在值

Php 查看深嵌套json数组中是否存在值,php,arrays,Php,Arrays,下面是我的简单json响应: Array ( [data] => Array ( [id] => 3 [type] => workspace [attributes] => Array ( [name] => testing [slug] => testi

下面是我的简单json响应:

Array
(
    [data] => Array
        (
            [id] => 3
            [type] => workspace
            [attributes] => Array
                (
                    [name] => testing
                    [slug] => testing
                    [data] =>
                    [created_at] => 
                    [updated_at] => 
                    [role] => Amazing
                    [last_accessed_at] =>
                )

        )

)
是否有可能生成一个简单地在给定路径中查找给定值的泛型函数

例如,我想创建一个函数,用给定的键递归搜索给定的值:

public function seeIfValueExistsInJson("data.attributes.slug", "testing"){

}
我想让它尽可能的通用,因为响应的第一项不是“数据”,可能是其他东西

有没有人看过/做过类似的东西并愿意分享

谢谢:)


更新: 我在技术上做到了这一点。但我知道这不是最好的方法,因为它感觉不到或看起来不像,我希望看到您对如何改进它的批评,以帮助我进一步改进代码:

public function extractData($fullPath, $value)
    {

        $jsonString = json_encode($this->json());
        $paths = explode(".", $fullPath);
        $oldPos = 0;
        $len = sizeof($paths) - 1;
        foreach ($paths as $path) {
            if (strpos($jsonString, $path) !== false) {
                $currPos = strpos($jsonString, $path);
                if ($currPos > $oldPos) {
                    if ($len === 0) {
                        $valuePos = strpos($jsonString, $value);
                        PHPUnit::assertTrue($currPos < $valuePos);
                        break;
                    }
                    $len--;
                }
                $oldPos = $currPos;
            } else {
                print("The path: '$path' is not within this Json response");
            }
        }
    }
public函数提取数据($fullPath,$value)
{
$jsonString=json_encode($this->json());
$PATH=分解(“.”,$fullPath);
$oldPos=0;
$len=sizeof($path)-1;
foreach($path作为$path){
if(strpos($jsonString,$path)!==false){
$currPos=strpos($jsonString$path);
如果($currPos>$oldPos){
如果($len==0){
$valuePos=strpos($jsonString$value);
PHPUnit::资产真实($currPos<$valuePos);
打破
}
$len--;
}
$oldPos=$currPos;
}否则{
打印(“路径:“$path”不在此Json响应中”);
}
}
}
正如您所看到的,此函数将给定的响应json转换为字符串,并获取您给它的每个“路径”索引的位置(分解后),然后确保索引的上一个位置小于下一个位置(这样就意味着您要查找的下一个索引路径必须在后面)然后,一旦它到达循环的末尾,它将(在我的例子中使用phpunit)断言您给定的值在列表中比最后一个索引路径更远。就响应中的同一字符串等而言,这似乎有很多缺陷。因此,我欢迎任何关于如何改进这一点的反馈。我强烈建议不要将字符串编码为JSON,然后搜索JSON。这种策略在一般意义上是行不通的。您需要遍历数据结构,可能需要使用某种递归函数。(我不会在这里写。)


如果数据以JSON的形式输入,则应首先将其解码为数据结构。(将JSON字符串视为“黑盒”)

因为您已经有了一个数组,所以可以分解
$fullPath
并搜索该数组中的每个键。如果没有这样的键,则返回
false
。否则,请检查路径的值是否等于
$value

$arr = ['data' => ['id' => 3, 'type' => 'workspace',
        'attributes' => ['name'=>'testing', 'slug'=>'testing', 
                         'data' => '', 'created_at' =>'',
                         'updated_at' => '', 'role' => 'Amazing',
                         'last_accessed_at' => '']]];

function seeIfValueExistsInJson($arr, $fullPath, $value){
    $tempArr = $arr;
    $keys = explode('.', $fullPath);
    foreach($keys as $key){
      if(isset($tempArr[$key])){
          $tempArr = $tempArr[$key];
      }
      else return false;
    }
    return $tempArr === $value;
}

$result = seeIfValueExistsInJson($arr, "data.attributes.slug", "testing");
echo 'Result: ' . $result;
这将返回:

Result: 1 
您可以使用PHP函数

<?php
$data = json_decode($json);
$hasData = false;
$searchString = "";
array_walk_recursive($data, function($value, $key) {
    $hasData = $hasData || $value == $searchString;
});

您好,您能添加到目前为止您已经尝试过的内容吗?Stackoverflow不是免费的编码服务。请尝试自己解决您的问题,并返回一个关于实际代码的问题。谢谢。由于JSON仅仅是一个字符串,您可以查看JSON字符串是否包含您想要的值,如果包含,则从那里执行任何逻辑…是的,当然,对不起。我已经尝试手动创建自己的函数,以确定第一个数组是否与给定的数组相同,然后继续下一个数组,但被卡住,无法继续。尝试使用不同数组函数的组合,但没有avail@TobyR你应该添加你尝试过的其他代码,以及你的尝试是如何出错的:包括他们给出了什么错误消息,或者他们的输出是如何偏离你期望的结果的。我知道你强烈建议不要这样做,因为这显然有很多缺陷和问题。这就是为什么我试图找到另一种方法:/