2011-11-09 13 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; 
} 

例外は、ここでやや「暴力的」かもしれないが、少なくとも、あなたは必要なときに起こっている内容を正確に把握することができます。

敏感な心臓の場合、3つ目の$defaultValueオプションパラメータは、インデックスの1つが見つからない場合にフォールバック値を提供することができます。

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を返します。

あなたはあなたの鍵に基づいて、ちょうどステップトラフ(任意の再帰、単純な foreachを行う必要はありません)することができます
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

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

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

あなたは関数の中にそれを置く場合、それはしませんあなたがしたくない場合は、参照を保管してください。 Demo

関連する問題