Intereting Posts
Перенаправление в другую папку Круговая зависимость. Инъекция объектов, которые напрямую зависят друг от друга Вам нужен файл web.config вместо .htaccess для codeigniter MySql получает все строки, где id = xxx и где самый новый столбец в другой таблице в строке с одинаковым идентификатором больше одного заменяя .php ext на .html через .htaccess Диакритический бесчувственный поиск mysql? Загрузите класс с другим именем, чем тот, который был передан автозагрузчику в качестве аргумента Удалите пустые поля в массиве после foreach в PHP Открытие файла CSV Inline в браузере, а не приглашение DL Недопустимые файлы списков разрешений Google API. PHP readfile vs. file_get_contents Почему этот процесс не работает в фоновом режиме? PHP и MYSQL: использование хэша bcrypt и проверка пароля с базой данных file_get_contents возвращает 404, когда URL-адрес открыт с помощью браузера, и URL-адрес действителен Эффективный способ проверить, находится ли текущая дата между двумя датами (годы не имеют значения)

Как использовать строку в качестве пути индекса массива для получения значения?

Скажем, у меня есть массив вроде:

Array ( [0] => Array ( [Data] => Array ( [id] => 1 [title] => Manager [name] => John Smith ) ) [1] => Array ( [Data] => Array ( [id] => 1 [title] => Clerk [name] => ( [first] => Jane [last] => Smith ) ) ) ) 

Я хочу, чтобы иметь возможность построить функцию, через которую я могу передать строку, будет действовать как путь индекса массива и вернуть значение соответствующего массива без использования eval() . Это возможно?

 function($indexPath, $arrayToAccess) { // $indexPath would be something like [0]['Data']['name'] which would return // "Manager" or it could be [1]['Data']['name']['first'] which would return // "Jane" but the amount of array indexes that will be in the index path can // change, so there might be 3 like the first example, or 4 like the second. return $arrayToAccess[$indexPath] // <- obviously won't work } 

Solutions Collecting From Web of "Как использовать строку в качестве пути индекса массива для получения значения?"

вы можете использовать массив как путь (слева направо), а затем рекурсивную функцию:

 $indexes = {0, 'Data', 'name'}; function get_value($indexes, $arrayToAccess) { if(count($indexes) > 1) return get_value(array_slice($indexes, 1), $arrayToAccess[$indexes[0]]); else return $arrayToAccess[$indexes[0]]; } 

Немного позже, но … надежда помогает кому-то:

 // $pathStr = "an:string:with:many:keys:as:path"; $paths = explode(":", $pathStr); $itens = $myArray; foreach($paths as $ndx){ $itens = $itens[$ndx]; } 

Теперь itens является частью массива, который вы хотели.

[] 'S

Labs

Это старый вопрос, но на него ссылаются, поскольку этот вопрос возникает часто.

Существуют рекурсивные функции, но я использую ссылку:

 function array_nested_value($array, $path) { $temp = &$array; foreach($path as $key) { $temp =& $temp[$key]; } return $temp; } $path = array(0, 'Data', 'Name'); $value = array_nested_value($array, $path); 

Попробуйте следующее: $ indexPath форматируется как путь к файлу, т.е.

 '<array_key1>/<array_key2>/<array_key3>/...'. function($indexPath, $arrayToAccess) { $explodedPath = explode('/', $indexPath); $value =& $arrayToAccess; foreach ($explodedPath as $key) { $value =& $value[$key]; } return $value; } 

например, используя данные из вопроса, $ indexPath = '1 / Data / name / first' вернет значение $ value = Jane.

 function($indexPath, $arrayToAccess) { eval('$return=$arrayToAccess'.$indexPath.';'); return $return; } 

Вы должны разбирать строку indexPath. Выделите некоторый разделитель (например, «.»), Прочитайте текст до «.». это будет первым ключом, затем прочитайте остаток до следующего, это будет следующий ключ. Сделайте это, пока не увидите больше точек.

Вы можете хранить ключ в массиве. Сделайте цикл foreach на этом массиве, чтобы получить искомый элемент.

Вот один из способов выполнить задание, если синтаксический анализ строк – это то, как вы хотите.

 $data[0]["Data"]["stuff"] = "cake"; $path = "[0][\"Data\"]['stuff']"; function indexPath($path,$array){ preg_match_all("/\[['\"]*([a-z0-9_-]+)['\"]*\]/i",$path,$matches); if(count($matches[1]) > 0) { foreach ($matches[1] as $key) { if (isset($array[$key])) { $array = $array[$key]; } else { return false; } } } else { return false; } return $array; } print_r(indexPath($path,$data)); 

preg_match_all , перемещаясь по согласованным результатам, даст вам CLOSE результат, который вы хотели. Вы должны быть осторожны со всеми перечисленными здесь стратегиями для утерянной информации. Например, вам необходимо каким-то образом обеспечить, чтобы 55 оставался как тип int и не анализировался как строка типа.

В дополнение к AbraCadaver:

 function array_nested_value($array, $path) { foreach($path as $key) { $array = $array[$key]; } return $array; } $path = array(0, 'Data', 'Name'); $value = array_nested_value($array, $path); 

Возможное использование

 function get_array_value($array=array(), $path=array()){ foreach($path as $key) { if(isset($array[$key])){ $array=$array[$key]; } else{ $array=NULL; break; } } return $array; } function custom_isset($array=array(), $path=array()){ $isset=true; if(is_array($array)&&is_null(get_array_value($array, $path))){ $isset=false; } return $isset; } function is($array=array(), $path=array()){ $is=false; if(is_array($array)){ $array_value=get_array_value($array, $path); if(is_bool($array_value)){ $is=$array_value; } } return $is; } 

пример

  $status=[]; $status['updated']=true; if(is($status,array('updated'))){ //do something... } 

Ресурсы

https://gist.github.com/rafasashi/0d3ebadf08b8c2976a9d

Если вы уже знаете точный элемент массива, который вы вытаскиваете, зачем писать функцию для этого? Что не так с просто

 $array[0]['data']['title']