使用PHP动态挖掘JSON

时间:2016-02-26 13:15:39

标签: php json

好的,所以我需要动态地使用PHP挖掘JSON结构,我甚至不知道它是否可行。

所以,假设我的JSON存储在变量$data

$data = {
  'actions':{
     'bla': 'value_actionBla',
     'blo': 'value_actionBlo', 
  }
}

因此,要访问value_actionsBla的值,我只需$data['actions']['bla']。很简单。

我的JSON是动态生成的,下次就是这样:

$data = {
  'actions':{
     'bla': 'value_actionBla',
     'blo': 'value_actionBlo', 
     'bli':{
       'new': 'value_new'
     }
  }
}

再一次,要获得new_value,我会:$data['actions']['bli']['new']

我猜你看到了这个问题。

如果我需要挖掘两个级别,那么我需要编写$data['first_level']['second_level'],其中三个,它将是$data['first_level']['second_level']['third_level']等等......

有没有办法动态执行此类操作? (鉴于我知道钥匙)

EDIT_0:以下是我迄今为止如何做到这一点的示例(以非动态方式,2 级别

// For example, assert that 'value_actionsBla' == $data['actions']['bla']
foreach($data as $expected => $value) {
  $this->assertEquals($expected, $data[$value[0]][$value[1]]);
}

EDIT_1

基于@Matei Mihai的解决方案,我已经做了一个递归函数:

private function _isValueWhereItSupposedToBe($supposedPlace, $value, $data){
        foreach ($supposedPlace as $index => $item) {
            if(($data = $data[$item]) == $value)
                return true;
            if(is_array($item))
                $this->_isValueWhereItSupposedToBe($item, $value, $data);
        }
        return false;
}

public function testValue(){
        $searched = 'Found';
        $data = array(
            'actions'  => array(
                'abort' => '/abort',
                'next' => '/next'
            ),
            'form' => array(
                'title' => 'Found'
            )
        );
        $this->assertTrue($this->_isValueWhereItSupposedToBe(array('form', 'title'), $searched, $data));
}

2 个答案:

答案 0 :(得分:2)

您可以使用递归函数:

function array_search_by_key_recursive($needle, $haystack)
{
    foreach ($haystack as $key => $value) {
        if ($key === $needle) {
             return $value;
        }
        if (is_array($value) && ($result = array_search_by_key_recursive($needle, $value)) !== false) {
             return $result;
        }
    }

    return false;
}

$arr = ['test' => 'test', 'test1' => ['test2' => 'test2']];

var_dump(array_search_by_key_recursive('test2', $arr));

结果为string(5) "test2"

答案 1 :(得分:1)

您可以使用这样的函数递归遍历数组(假设您知道要访问的值的所有键!):

function array_get_nested_value($data, array $keys) {
    if (empty($keys)) {
        return $data;
    }
    $current = array_shift($keys);
    if (!is_array($data) || !isset($data[$current])) {
        // key does not exist or $data does not contain an array
        // you could also throw an exception here
        return null;
    }
    return array_get_nested_value($data[$current], $keys);
}

像这样使用:

$array = [
    'test1' => [
        'foo' => [
            'hello' => 123
        ]
    ],
    'test2' => 'bar'
];
array_get_nested_value($array, ['test1', 'foo', 'hello']); // will return 123