如何使用string作为数组索引path来检索一个值?

假设我有一个数组:

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 ) ) ) ) 

我想能够build立一个函数,我可以传递一个string作为数组索引path,并返回适当的数组值,而不使用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 } 

你可以使用一个数组作为path(从左到右),然后是一个recursion函数:

 $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是你想要的数组的一部分。

[]的

实验室

这是一个古老的问题,但它被引用经常出现这个问题。

有recursion函数,但我使用一个引用:

 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被格式化为文件path,即

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

你必须parsingindexPathstring。 select一些分隔符(例如“。”),直到阅读文本“。”。 这将是第一个关键,然后阅读rest,直到下一个,这将是下一个关键。 这样做,直到没有更多的点。

你肯存储密钥在数组中。 在这个数组上执行foreach循环来获取search元素。

如果stringparsing是你想要的方式,这是一个完成工作的方法。

 $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到你想要的结果。 您需要小心这里列出的所有策略以获取丢失的信息。 例如,你必须devise一些方法来确保55保持为inttypes,并且不被parsing为typesstring。

除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']