Я решил это, обновив xml2
непосредственно в моей локальной библиотеке R, вместо того, чтобы полагаться на импорт rvests
.
install.packages("xml2")
Примерно так
$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 уровень, например, если мы начнем с этого
[ 111]Вывод
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 Я бы использовал реальные данные, если бы они были предоставлены, но поскольку это единственный способ для меня проверить это, объяснить это. [1119 ]
Кроме того, это, очевидно, хороший кандидат для создания функции из:
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;
}
Надеюсь, это поможет.
То, что вы пытаетесь сделать, не сработает, потому что вы пытаетесь преобразовать переменную в код PHP. PHP не знает, что это ваше намерение, и не выполняет этот код.
PHP имеет конструкцию eval()
, которая позволяет вам сделать это.
Внимание. Языковая конструкция eval () очень опасна, поскольку она позволяет выполнять произвольный код PHP. Таким образом, его использование не рекомендуется. Если вы тщательно проверили, что нет другого выбора, кроме как использовать эту конструкцию, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленные пользователем, без надлежащей проверки их заранее.
blockquote>Руководство по PHP для для eval объясняет больше.
Оценить строку как код PHP
blockquote>В вашем случае будет работать следующий код.
$nested_array_selectors = '["my_array"]["my_key"]["my_elemnt"]'; eval('var_dump($my_instance->my_object' . $nested_array_selectors . ')');