2016-07-03 9 views
2

私はすべての次元で一意のキーを持つ動的多次元配列を持っています。 (アレイがすべてのキーが一意であることを示す一例で下に配列のキーは、何することができる。)PHP:多次元配列のキーの正確な位置を見つける

$data = array(
'0' => array(
    '0-0' => array(
     '0-0-0' => array(
      '0-0-0-0' => 'some value', 
      '0-0-0-1' => 'some value', 
      ), 
     '0-0-1' => array(
      '0-0-1-0' => 'some value', 
      '0-0-1-1' => 'some value', 
      '0-0-1-2' => 'some value', 
      ), 
     '0-0-2' => array(
      '0-0-2-0' => 'some value', 
      '0-0-2-1' => 'some value', 
      ), 
     '0-0-3' => array(
      '0-0-3-0' => 'some value', 
      ), 
     ), 
    '0-1' => array(
     '0-1-0' => array(
      '0-1-0-0' => 'some value', 
      '0-1-0-1' => 'some value', 
      ), 
     '0-1-1' => array(
      '0-1-1-0' => 'some value', 
      '0-1-1-1' => 'some value', 
      ), 
     '0-1-2' => array(
      '0-1-2-0' => 'some value', 
      '0-1-2-1' => 'some value', 
      ), 
     ), 
    ), 
'1' => 'some value', 
'2' => array(
    '2-0' => 'some value', 
    '2-1' => array(
     '2-1-0' => 'some value', 
     ), 
    ), 
); 

深さとサブアレイの数は動的です。すべてのキーは一意ですが、上の例のようなパターンはありません。

この配列内の特定のキーの正確な位置(すべての親を階層的に持つ)を見つける必要があります。例えば; array('2', '2-1', '2-1-0') get_key_position('1', $data);を返す必要があります

get_key_position('0-1-2-1', $data);array('0', '0-1', '0-1-2', '0-1-2-1') get_key_position('2-1-0', $data);を返す必要がありますarray('1')

+1

レベルごとにキーを保存しないのはなぜですか?たとえば、キー0-1-2-1は '$ array [0] [1] [2] [1]'となります。さらに、あなたのキーはすでに次元レベルを持っているので、これをすべて1つの配列に保存することができます。データを繰り返すことは、何かが改善されるという兆候です。 – sidyll

+0

@sidyllキーは "0-1-2-1"のようにする必要はありません。これは、すべてのキーが一意であることを示す単なる例でした。私はそれを明確にするために質問を編集しました。 –

+2

私は参照してください。申し訳ありませんが、あなたの問題は間違っています。これを確認してください:http://stackoverflow.com/questions/12038137/retrieve-all-parent-keys-of-a-given-child-key-in-array – sidyll

答えて

1

を返す必要があります私はので、多分、私は再だ、行くと、あなたの質問の下のコメントが引用異なるリンクで見て努力をしていませんでしたホイール:)とにかく

を-inventing、これはどのような状況で動作するようです:

function look4key($key, $data, $path = []) { 
    if (is_array($data)) { 
    foreach ($data AS $localKey => $value) { 
     $localKey = (string)$localKey; 
     $localPath = array_merge($path, [$localKey]); 
     if ($localKey == $key) { 
     return $localPath; 
     } 
     if ($nestedPath = look4key($key, $value, $localPath)) { 
     return $nestedPath; 
     } 
    } 
    } 
    # returns NULL if $key not found 
} 

が、それはこの落とし穴を除き、むしろ自明のご希望:(string)$localKeyが原因でこの自動キャスト(php manualを見て)で、'0''1'、などのようなキーのために必要です:有効な整数を含む

文字列がにキャストされます整数型。例えば。キー "8"は実際には8の下に格納されます。

関連する問題