2016-05-30 1 views
3

Je ne suis pas sûr comment appeler cela, et je ne peux pas trouver ce que je cherche parce que je dois être à la recherche pour les mauvais mots-clés, de sorte que même le terme de recherche à droite me aiderait ici:Comment cartographier la profondeur de la matrice?

J'ai un tableau $ map et un tableau $ data. Le tableau $ data est un tableau dynamique basé sur un fichier xml analysé. Exemple simplifié:

$data = array('a' => array(0=> array('hello'=>'I want this data'))); 

$map = array('something' => 'a.0.hello'); 

Maintenant, j'aimerais mettre $test à la valeur de $data['a']['0']['hello'] en naviguant à l'aide d'une certaine manière il $map['something']. L'idée sous-jacente est de créer un tableau de mappage afin qu'aucun changement de code ne soit requis si le format xml doit être modifié, uniquement le tableau de mappage. Toute aide dans la bonne direction est très appréciée :)

+0

cherchez-vous la valeur de 'quelquechose' pour naviguer dans le' je veux cette donnée' –

+0

Pouvez-vous être plus précis sur ce dont vous avez exactement besoin? Voulez-vous quelque chose à pointer vers une chaîne? Peut-être faire une fonction qui explose la chaîne et utilise ses éléments comme index (s) pour l'autre tableau ?! – JRsz

Répondre

3
// Set pointer at top of the array 
$path = &$data; 
// Asume that path is joined by points 
foreach (explode('.', $map['something']) as $p) 
    // Make a next step 
    $path = &$path[$p]; 
echo $path; // I want this data 
+1

* qu'aucun changement de code n'est requis si le format xml doit être changé, seul le tableau de mapping * - je l'ai compris donc – splash58

+0

Est-ce qu'il n'est pas difficile pour l'OP de faire un tel tableau ... –

+0

@FrayneKonok Peut-être, difficile à écrire un tel code :) – splash58

1

Il n'y a pas vraiment une bonne façon d'accéder par programmation clés imbriquées dans des tableaux en PHP (ou toute autre langue que je peux penser, en fait).

function getDeepValue(&$arr, $keys) { 
    if (count($keys) === 0) 
    return $arr; 
    else 
    return getDeepValue($arr[$keys[0]], array_slice($keys, 1)); 
} 

$data = ['a' => [0=> ['hello'=>'I want this data']]]; 
$map = ['something' => getDeepValue($data, ['a', '0', 'hello'])]; 

var_dump($map); 

// array(1) { 
// ["something"]=> 
// string(16) "I want this data" 
// } 

Si vous souhaitez utiliser la chaîne de clés, il suffit d'utiliser

getDeepValue($arr, explode('.', 'a.0.hello')) 

Si c'est une opération commune que vous avez à faire, vous pouvez ajouter une autre couche d'abstraction qui accepte recherche basée sur une chaîne de valeurs profondes.