Проблема в том, что вы не можете пройти несколько уровней в одной строке.(Если это так, PHP должен будет начать поиск фрагментов кода внутри ключей строкового массива. И как он узнает, следует ли интерпретировать их как фрагменты, а затем разделить строковый ключ или продолжать обрабатывать его как одну строку ??)
Alt 1
Одно из решений - изменить структуру $data
и сделать ее одноуровневым массивом.Затем вы предоставляете ключи для всех уровней, необходимых для поиска ваших данных, , объединенных в строку .Конечно, вам нужно найти разделитель, который работает в вашем случае.Если ключи представляют собой простые строки, то что-то простое, например подчеркивание, должно работать нормально.Кроме того, это не изменит структуру вашей базы данных, только способ хранения данных.
function getDbItem($keys) {
// Use this to get the "old version" of the key back. (I.e it's the same data)
$joinedKey = "['".implode("'],['", $keys)."']";
$joinedKey = implode('_', $keys);
return $data[$joinedKey];
}
// Example
$data = [
'volvo' => 'nice whip',
'drivers_mike' => 'decent'
];
var_dump(getDbItem(['drivers', 'mike'])); // string(6) "decent"
Alt 2
Другой способ - не изменять количество уровней в $data
, но просто проследуйте по нему, используя переданные ключи:
$tgt = $data;
foreach($keys as $key) {
if (array_key_exists($key, $tgt)) {
$tgt = $tgt[$key];
}
else {
// Non existing key. Handle properly.
}
}
// Example
$keys = ['drivers', 'mike'];
// run the above code
var_dump($tgt); // string(6) "decent"