如何映射数组深度?

时间:2016-05-30 09:29:03

标签: php arrays

我不确定怎么称呼这个,我找不到我要找的东西,因为我一定在寻找错误的关键词,所以即使是正确的搜索词也能帮到我在这里:

我有一个$ map数组和一个$ data数组。 $ data数组是一个基于解析的xml的动态数组。简化示例:

$data = array('a' => array(0=> array('hello'=>'I want this data')));

$map = array('something' => 'a.0.hello');

现在,我想通过$test以某种方式在$data['a']['0']['hello']导航,将$map['something']设置为{{1}}的值。这背后的想法是创建一个映射数组,这样如果要更改xml格式,则不需要更改代码,只需要更改映射数组。非常感谢任何有关良好方向的帮助:)

2 个答案:

答案 0 :(得分:3)

// Set pointer at top of the array 
$path = &$data;
// Asume that path is joined by points
foreach (explode('.', $map['something']) as $p) 
   // Make a next step
   $path = &$path[$p];
echo $path; // I want this data

答案 1 :(得分:1)

在PHP中(或者我能想到的任何其他语言),以编程方式访问数组中的嵌套键并不是一个好方法。

function getDeepValue(&$arr, $keys) {
  if (count($keys) === 0)
    return $arr;
  else
    return getDeepValue($arr[$keys[0]], array_slice($keys, 1));
}

$data = ['a' => [0=> ['hello'=>'I want this data']]];
$map = ['something' => getDeepValue($data, ['a', '0', 'hello'])];

var_dump($map);

// array(1) {
//   ["something"]=>
//   string(16) "I want this data"
// }

如果您想使用密钥串,请使用

getDeepValue($arr, explode('.', 'a.0.hello'))

如果这是您必须执行的常见操作,您可以添加另一层抽象,接受基于字符串的深度值查找。