2011-07-08 13 views
3

別の配列をパスとして使用して、特定の配列のプロパティにアクセスしたいとします。問題は、問題のプロパティがどんな深さにあるかもしれないということです。ここでは一例だ...別の配列の値をターゲットにするパスとしてPHP配列を使用するにはどうすればよいですか?

は、私は、データの連想配列を持っている:

$data = array(
    '1' => 'somethings_value', 

    '2' => 'another_value', 

    '3' => array(
     '1' => 'deeper_value', 
    ), 
); 

は今、私はこれらの値のいずれかにアクセスしたいが、(キーを使用)、それらへのパスを決定します別の配列を使用して。

$path = array('3', '1'); 

$path配列私は(文字列'deeper_value'だろう)値$data[3][1]を取得したいという使い方:だから私はこのようなパスの配列を持っていたと言います。

$path = array('1'); 

文字列値'somethings_value'になるだろう:

問題は、私はまた、このようなパスの配列を得ることができ、たとえばアクセスする値は、任意の深さであってもよいことです。私は今問題が明確になることを願っています。

これは、ターゲット配列にある値をターゲットにするためにその値をキーとして使用するために、どうやってこのパス配列をループするのですか?

ありがとうございます!

EDIT:読みやすくするためにデータ配列のキーとして数字を使用していますが、実際の問題のキーは実際には文字列です。

答えて

3

単純なループが動作するはずです:

更新:

:申し訳ありませんが、私のコード

foreach($path as $id) 
{ 
    $data = $data[$id]; 
} 

echo $data; 

の検索結果を確認しました

deeper_value 

これは$data配列を上書きするので、彼の例ではDavidのように最初に$dataのコピーを作成したいかもしれません。ここで

+1

このメソッドでは、 '$ data [3] [1]'にアクセスすることはできません。 –

+0

私は何を言おうとしているのか分かりませんが、 'foreach'は常に' $ id'を正しい順序で使用しますか?たとえば、Javaではそうではありません。 – SteeveDroz

+0

@davidおかげでテストしなかった:) –

2

それが最大のコードではないですが、動作するはずです:

function getValue($pathArray, $data) 
{ 
    $p = $data; 
    foreach ($pathArray as $i) 
    { 
    $p = $p[$i]; 
    } 

    return $p; 
} 
+3

あなたは 'はGlobal'キーワードを使用しない限り、あなたが関数内' $のdata'にアクセスすることはできません。 'global'は不自由なので、' $ data'を関数パラメータとして渡す必要があります。これにより、明示的にコピーを作成する必要がなくなります。 – grossvogel

+0

@grossvogel良い点が更新されました。 –

0

は異なるアプローチです:

while($d = array_shift($path)) 
    $data = $data[$d]; 
関連する問題