好的,所以我需要动态地使用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));
}
答案 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