2016-03-25 1 views
-1

Imaginez que vous ayez les structures de données suivantes. Le fichier de configuration est un hachage de valeurs de configuration. La recherche est un tableau de clés de hachage pour extraire une valeur de configuration du hachage de configuration.Comment rechercher un tableau multidimensionnel avec un tableau de clés

$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'; 

Quelle est la manière la plus efficace d'utiliser le tableau $ search pour obtenir la valeur "Garfield High". Cela ressemble à une tâche scolaire, mais ce n'est pas le cas. J'ai erré dans un trou de lapin, et même si je vais probablement abandonner ce que je fais, je suis curieux de savoir comment résoudre ce problème. Il semble que ce devrait être facile, mais pour une raison quelconque, je suis perplexe.

La méthode pour extraire les valeurs de $ config devrait fonctionner avec n'importe quelle taille de tableau $ search. Il doit aussi fonctionner avec $ search = array ('school', 'superintendent').

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

} 
+0

Voulez-vous seulement la valeur finale retour. Par exemple, la recherche de «enseignant» renvoie «pomme» et la recherche de «école» renvoie «Garfield High» et «Boris York» comme un tableau à deux éléments? – kainaw

+0

Pas vraiment, parce que vous pourriez $ config ['users'] ['students'] ['highschool'] ['domain'] qui pourrait avoir la valeur 'highschool.ghs.com'. La clé de fin serait «domaine» mais le chemin d'accès passerait par «highschool» plutôt que «default», par exemple. Oui, je ne veux que la valeur finale, mais les touches de valeur finale ne sont pas uniques en elles-mêmes. – Halfstop

Répondre

2

Il est une simple boucle, en utilisant chaque élément de $search comme la clé dans le niveau suivant du tableau recherchée.

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

@Halfstop J'ai ajouté une démo montrant que mon code fonctionne. – Barmar

+0

Vous avez raison, je ne l'ai pas lu correctement. – Halfstop

0

solution alternative avec RecursiveIteratorIterator Classe:

$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