2011-11-09 49 views
1

我在找做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

我目前正在尝试递归的方式。我会在几分钟后发布它,也许作为答案。 –

回答

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

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

+0

+1不错,我走的路线相同,但你是更快的。我会离开这里,因为它也有错误处理。 – kapa

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]]; 
    } 
} 
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; 
    } 
} 
+0

+1,好又短! – halfdan

2

您只需一步低谷根据你的钥匙(无需做任何递归,只是一个简单的foreach):

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

    $result = &$result[$index]; 
} 

如果你把它放在一个函数内,那么就不会如果你不想要,请保留参考。 Demo