从索引列表中获取多维数组的值(数组也是如此)

时间:2011-11-09 15:35:25

标签: php multidimensional-array

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

感谢。

6 个答案:

答案 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可选参数可以允许在未找到其中一个索引的情况下提供回退值。