Как заменить селектор вложенного или многоуровневого массива одной строкой

Я решил это, обновив xml2 непосредственно в моей локальной библиотеке R, вместо того, чтобы полагаться на импорт rvests.

install.packages("xml2")

0
задан karel 28 March 2019 в 06:08
поделиться

2 ответа

Примерно так

$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;
}

Надеюсь, это поможет.

0
ответ дан ArtisticPhoenix 28 March 2019 в 06:08
поделиться

То, что вы пытаетесь сделать, не сработает, потому что вы пытаетесь преобразовать переменную в код PHP. PHP не знает, что это ваше намерение, и не выполняет этот код.

PHP имеет конструкцию eval(), которая позволяет вам сделать это.

Внимание. Языковая конструкция eval () очень опасна, поскольку она позволяет выполнять произвольный код PHP. Таким образом, его использование не рекомендуется. Если вы тщательно проверили, что нет другого выбора, кроме как использовать эту конструкцию, обратите особое внимание на то, чтобы не передавать какие-либо данные, предоставленные пользователем, без надлежащей проверки их заранее.

Руководство по PHP для для eval объясняет больше.

Оценить строку как код PHP

В вашем случае будет работать следующий код.

$nested_array_selectors = '["my_array"]["my_key"]["my_elemnt"]';
eval('var_dump($my_instance->my_object' . $nested_array_selectors . ')');
0
ответ дан Steve E. 28 March 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: