从索引列表(也是数组)中获取一个值到多维数组中


Getting a value into multidimensional array from a list of indexes (array too)

我正在寻找一种很好的方式来做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];

谢谢。

你可以递归地解决这个问题。

$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);调用函数会发生什么?

这是一个递归版本。如果在给定的索引路由中找不到值,将返回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;
    }
}

您可以根据您的密钥进行步进(不需要进行任何递归,只需简单的foreach):

$result = &$multiDimensionalArray;
foreach($indexes as $index)
{
    if (!isset($result[$index]))
        break; # Undefined index error
    $result = &$result[$index];
}

如果你把它放在一个函数中,那么如果你不想,它就不会保留引用。演示。

我想这样的东西应该对你有帮助。

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

试试: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]];
    }
}

我自己的尝试;终于,不用递归了,我觉得更简单了。

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可选参数可以允许在没有找到其中一个索引时提供一个回退值。