2016-03-25 12 views
-1

次のデータ構造を持っているとします。設定1は設定値のハッシュです。検索は、設定ハッシュから設定値を取得するためのハッシュキーの配列です。キーの配列で多次元配列を検索する方法

$config['users']['students']['default']['school'] = 'Garfield High'; 
$config['users']['students']['default']['domain'] = 'ghs.com'; 
$config['users']['teacher']['default']['fruit'] = 'apple'; 
$config['school']['superintendent'] = 'Boris York'; 

$search[] = 'users'; 
$search[] = 'students'; 
$search[] = 'default'; 
$search[] = 'school'; 

"ガーフィールドハイ"の値を取得するために、$検索配列を使用する最も効率的な方法は何ですか?

これは学校の割り当てのように聞こえますが、実際はそうではありません。私はウサギの穴を徘徊してしまいました。私がやっていることをおそらく放棄していますが、私はこの問題を解決するにはどうしたらいいのでしょうか。それは簡単だと思われるが、何らかの理由で私は困惑している。

$ configから値を抽出する方法は、任意の$ search配列サイズで機能するはずです。 $ search = array( 'school'、 'superintendent')も同様に動作する必要があります。

public function get($search, $config) { 
    // Somehow pull value from $config 

} 
+0

あなただけの終了値が返されますか。たとえば、 'teacher'の検索で 'apple'が返され、 'school'の検索で 'Garfield High'と 'Boris York'が2つのアイテムの配列として返されますか? – kainaw

+0

$ config ['users'] ['students'] ['highschool'] ['domain']の値が 'highschool.ghs.com'になる可能性があるからです。終了キーは「ドメイン」ですが、そのパスは「デフォルト」ではなく「高校」を経由します。はい、私は最終値だけを必要としますが、最終値キーはそれ自身の中でユニークではありません。 – Halfstop

答えて

2

それは検索される配列の次のレベルでキーとして$searchの各要素を使用して、単純なループです。 RecursiveIteratorIteratorクラスと

public function get($search, $config) { 
    $result = $config; 
    foreach ($search as $key) { 
     if (is_array($result) && isset($result[$key])) { 
      $result = $result[$key]; 
     } else { 
      return false; // not found 
     } 
    } 
    return $result; 
} 

DEMO

+0

@ハーフトップ私のコードが動作することを示すデモを追加しました。 – Barmar

+0

あなたが正しいです、私はそれを正しく読まなかった。 – Halfstop

0

代替ソリューション:

$config = ['users' => ['students' => ['default' => ['school' => 'Garfield High'], 'highschool' => ['domain' => 'highschool.ghs.com']]]]; 

$search1 = ['users', 'students', 'default', 'school']; 
$search2 = ['users', 'students', 'highschool', 'domain']; 

function getConfigItem($search = [], $config = []) { 
    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($config), \RecursiveIteratorIterator::SELF_FIRST); 
    $result = ""; 
    foreach ($iterator as $k => $v) { 
     if ($search[$iterator->getDepth()] == $k && is_string($v)) { 
      $result = $v; 
     } 
    } 
    return $result; 
} 

var_dump(getConfigItem($search1, $config)); // string 'Garfield High' 

var_dump(getConfigItem($search2, $config)); // string 'highschool.ghs.com' 

http://php.net/manual/en/class.recursiveiteratoriterator.php