我正在寻找一种很好的方式来做magicFunction()
:
$indexes = array(1, 3, 0);
$multiDimensionalArray = array(
'0',
array('1-0','1-1','1-2',array('2-0','2-1','2-2')),
array('1-4','1-5','1-6')
);
$result = magicFunction($indexes, $multiDimensionalArray);
// $result == '2-0', like if we did $result = $multiDimensionalArray[1][3][0];
感谢。
答案 0 :(得分:2)
你可以递归地解决这个问题。
$indexes = array(1, 3, 0);
$multiDimensionalArray = array(
'0',
array('1-0','1-1','1-2',array('2-0','2-1','2-2')),
array('1-4','1-5','1-6')
);
$result = magicFunction($indexes, $multiDimensionalArray);
function magicFunction($indices, $array) {
// Only a single index is left
if(count($indices) == 1) {
return $array[$indices[0]];
} else if(is_array($indices)) {
$index = array_shift($indices);
return magicFunction($indices, $array[$index]);
} else {
return false; // error
}
}
print $result;
只要有可用的索引,此函数将向下$multiDimensionalArray
,然后返回索引的最后一次访问值。您需要添加一些错误处理,例如如果您使用$indexes = array(1,2,3,4);
调用该函数会发生什么?
答案 1 :(得分:2)
这是一个递归版本。如果找不到具有给定索引路由的值,则返回null
。
function magicFunction($indexes, $array) {
if (count($indexes) == 1) {
return isset($array[$indexes[0]]) ? $array[$indexes[0]] : null;
} else {
$index=array_shift($indexes);
return isset($array[$index]) ? magicFunction($indexes, $array[$index]) : null;
}
}
答案 2 :(得分:2)
你可以根据你的键(不需要做任何递归,只需一个简单的foreach
)来逐步减少:
$result = &$multiDimensionalArray;
foreach($indexes as $index)
{
if (!isset($result[$index]))
break; # Undefined index error
$result = &$result[$index];
}
如果你把它放在一个函数中,那么如果你不想这样就不会保留引用。 Demo
答案 3 :(得分:1)
我觉得这样的事情可以帮到你。
function magicFuntion($indexes, $marray)
{
if(!is_array($indexes) || count($indexes) == 0 || !is_array($marray))
return FALSE;
$val = '';
$tmp_arr = $marray;
foreach($i in $indexes) {
if(!is_int($i) || !is_array($tmp_arr))
return FALSE;
$val = $tmp_arr[$i];
$tmp_arr = $tmp_arr[$i];
}
return $val;
}
答案 4 :(得分:0)
试试这个:P
function magicFunction ($indexes,$mdArr){
if(is_array($mdArr[$indexes[0]] && $indexes)){
magicFunction (array_slice($indexes,1),$mdArr[$indexes[0]]);
}
else {
return $mdArr[$indexes[0]];
}
}
答案 5 :(得分:0)
我自己的尝试;最后通过不递归来发现它更简单。
function magicFunction($arrayIndexes, $arrayData)
{
if (!is_array($arrayData))
throw new Exception("Parameter 'arrayData' should be an array");
if (!is_array($arrayIndexes))
throw new Exception("Parameter 'arrayIndexes' should be an array");
foreach($arrayIndexes as $index)
{
if (!isset($arrayData[$index]))
throw new Exception("Could not find value in multidimensional array with indexes '".implode(', ', $arrayIndexes)."'");
$arrayData = $arrayData[$index];
}
return $arrayData;
}
这里的例外情况可能有些“暴力”,但至少你可以在必要时知道到底发生了什么。
也许,对于敏感的心,第三个$defaultValue
可选参数可以允许在未找到其中一个索引的情况下提供回退值。