我有一个动态多维数组,在所有维度上都有唯一的键。(数组键可以是任何,下面的数组只是一个例子,表明所有键都是唯一的。)
$data = array(
'0' => array(
'0-0' => array(
'0-0-0' => array(
'0-0-0-0' => 'some value',
'0-0-0-1' => 'some value',
),
'0-0-1' => array(
'0-0-1-0' => 'some value',
'0-0-1-1' => 'some value',
'0-0-1-2' => 'some value',
),
'0-0-2' => array(
'0-0-2-0' => 'some value',
'0-0-2-1' => 'some value',
),
'0-0-3' => array(
'0-0-3-0' => 'some value',
),
),
'0-1' => array(
'0-1-0' => array(
'0-1-0-0' => 'some value',
'0-1-0-1' => 'some value',
),
'0-1-1' => array(
'0-1-1-0' => 'some value',
'0-1-1-1' => 'some value',
),
'0-1-2' => array(
'0-1-2-0' => 'some value',
'0-1-2-1' => 'some value',
),
),
),
'1' => 'some value',
'2' => array(
'2-0' => 'some value',
'2-1' => array(
'2-1-0' => 'some value',
),
),
);
子数组的深度和计数是动态的。所有键都是唯一的,但它们不像上面的例子那样具有模式。
我需要找到这个数组中给定键的确切位置(所有父级)。例如,
get_key_position('0-1-2-1', $data);
应该返回array('0', '0-1', '0-1-2', '0-1-2-1')
get_key_position('2-1-0', $data);
应该返回array('2', '2-1', '2-1-0')
get_key_position('1', $data);
应该返回array('1')
我没有努力去看看你的问题下评论引用的不同链接,所以也许我是在重新发明轮子:)
无论如何,这似乎在任何情况下都有效:
function look4key($key, $data, $path = []) {
if (is_array($data)) {
foreach ($data AS $localKey => $value) {
$localKey = (string)$localKey;
$localPath = array_merge($path, [$localKey]);
if ($localKey == $key) {
return $localPath;
}
if ($nestedPath = look4key($key, $value, $localPath)) {
return $nestedPath;
}
}
}
# returns NULL if $key not found
}
希望这是相当不言自明的,除了这个陷阱:(string)$localKey
需要像'0'
, '1'
等键,因为这个自动强制转换(查看php手册):
包含有效整数的字符串将被强制转换为整数类型。例如,键"8"将实际存储在8下。