对不起这个可怕的头衔,我当时想到的最好!假设我有一个像这样的'path'数组;
array('this', 'is', 'the', 'path')
在下面结束数组最有效的方法是什么?
array(
'this' => array(
'is' => array(
'the' => array(
'path' => array()
)
)
)
)
答案 0 :(得分:6)
只需使用array_shift或array_pop:
进行迭代$inarray = array('this', 'is', 'the', 'path',);
$tree = array();
while (count($inarray)) {
$tree = array(array_pop($inarray) => $tree,);
}
未经测试,但这是它的基本结构。递归也很适合这项任务。 或者,如果您不想修改初始数组:
$inarray = array('this', 'is', 'the', 'path',);
$result = array();
foreach (array_reverse($inarray) as $key)
$result = array($key => $result,);
答案 1 :(得分:6)
我使用两个类似的函数来获取和设置数组中的路径值:
function array_get($arr, $path)
{
if (!$path)
return null;
$segments = is_array($path) ? $path : explode('/', $path);
$cur =& $arr;
foreach ($segments as $segment) {
if (!isset($cur[$segment]))
return null;
$cur = $cur[$segment];
}
return $cur;
}
function array_set(&$arr, $path, $value)
{
if (!$path)
return null;
$segments = is_array($path) ? $path : explode('/', $path);
$cur =& $arr;
foreach ($segments as $segment) {
if (!isset($cur[$segment]))
$cur[$segment] = array();
$cur =& $cur[$segment];
}
$cur = $value;
}
然后你就像这样使用它们:
$value = array_get($arr, 'this/is/the/path');
$value = array_get($arr, array('this', 'is', 'the', 'path'));
array_set($arr, 'here/is/another/path', 23);
答案 2 :(得分:1)
function buildArrayFromPath( $path ) {
$out = array();
while( $pop = array_pop($path) ) $out = array($pop => $out);
return $out;
}
答案 3 :(得分:1)
一种递归解决方案:
function find_in_array(&$array, &$path, $_i=0) {
// sanity check
if ( !(is_array($array) && is_array($path)) ) return false;
$c = count($path); if ($_i >= $c) return false;
$k = $path[$_i];
if (array_key_exists($k, $array))
return ($_i == $c-1) ? $array[$k] : find_in_array($array[$k], $path, $_i+1);
else
return false;
}
参数$_i
供内部使用,调用函数时不应设置。
答案 4 :(得分:0)
不是很优雅。但它的工作原理
$ start = array('this','is','the','path')
$ result [$ start [0]] [$ start [1]] [$ start [2]] [$ start [3]] = array();