2011-11-09 87 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