как то так
$selectors = ["my_array","my_key","my_elemnt"];
$data = (array)$my_instance->my_object;
foreach($selectors as $k=>$v){
if(isset($data[$k])){
$data = $data[$k]; //reduce data by 1 level
}else{
$data = false;
break;
}
}
print_r($data);
Обычно каждый раз, когда вы перебираете «селектор», который существует в массиве, вы уменьшаете массив на 1 уровень, например, если мы начнем с этого
$data = ['foo'=>['bar'=>['baz'=>1]]];
$selectors = ["foo","bar","baz"];
foreach($selectors as $v){
print_r($data);
if(isset($data[$v])){
$data = $data[$v]; //reduce data by 1 level
}else{
$data = false;
break;
}
}
echo "\n---------- Final ------------\n";
print_r($data);
выход
Array
(
[foo] => Array
(
[bar] => Array
(
[baz] => 1
)
)
)
Array
(
[bar] => Array
(
[baz] => 1
)
)
Array
(
[baz] => 1
)
---------- Final ------------
1
Песочница
Вы можете увидеть «иллюстрированный» выше, как мы можем перейти к элементу, который мы хотим. Каждый array
выше является состоянием $data
до его снижения на этот уровень селекторов. Таким образом, один после этого показывает результаты его снижения. Таким образом, первый массив перед применением "foo"
, второй после этого, но до "bar"
и т.д ...
Если вы хотите использовать строку для $selectors
, например, с запятыми или чем-то еще, просто использовать explode()
или preg_split()
, чтобы разбить эту строку на некотором разделителе в массив. Например:
$selectors = "foo.bar.baz";
$selectors = explode(".", $selectors ); //["foo","bar","baz"]
//...
PS Я бы использовал реальные данные, если бы они были предоставлены, но поскольку это единственный способ для меня проверить это, объяснить это.
Кроме того, это, очевидно, хороший кандидат для создания функции:
function transverseWithKeys(array $array, $keys, $default=null, $glue='.'){
if(!is_array($keys)) $keys = explode($glue,$keys);
foreach($keys as $v){
if(isset($array[$v])){
$array= $array[$v]; //reduce data by 1 level
}else{
return $default;
}
}
return $array;
}
Надеюсь, это поможет.