2011-09-18 7 views
6
$first = array("a", "b" => array("c", "d" => array("e", "f")), "g", "h" => array("f")); 
$second = array("b", "d", "f"); 
$string = "foobar"; 

Dato il codice di cui sopra, come posso impostare un valore in $first gli indici definiti $second ai contenuti di $string? Significato, per questo esempio, dovrebbe essere $first["b"]["d"]["f"] = $string;, ma i contenuti di $second e $first possono essere di qualsiasi lunghezza. $second tuttavia sarà sempre unidimensionale. Ecco quello che avevo provato, che non sembra funzionare come previsto:Come accedere in modo dinamico i valori in un array variabile multidimensionale

$key = ""; 
$ptr = $first; 
for($i = 0; $i < count($second); $i++) 
{ 
    $ptr &= $ptr[$second[$i]]; 
    $key = key($ptr); 
} 
$first[$key] = $string; 

Questo farà $first["f"] = $string; al posto dei corretti indici multidimensionali. Avevo pensato che l'utilizzo di key avrebbe trovato la posizione all'interno della matrice compresi i livelli che aveva già spostato verso il basso.

Come accedere ai tasti corretti in modo dinamico? Potrei gestirlo se il numero di dimensioni fosse statico.

MODIFICA: Inoltre, mi piacerebbe un modo per farlo che non usi eval.

risposta

9

È un po 'più complicato di così. Devi inizializzare ogni livello se non esiste ancora. Ma i vostri problemi attuali sono:

  • L'array si desidera aggiungere il valore è in $ptr, non in $first.
  • $x &= $y è abbreviazione di $x = $x & $y (bit a AND). Quello che vuoi è x = &$y (assegna per riferimento).

Questo dovrebbe farlo:

function assign(&$array, $keys, $value) { 
    $last_key = array_pop($keys); 
    $tmp = &$array; 
    foreach($keys as $key) { 
     if(!isset($tmp[$key]) || !is_array($tmp[$key])) { 
      $tmp[$key] = array(); 
     } 
     $tmp = &$tmp[$key]; 
    } 
    $tmp[$last_key] = $value; 
    unset($tmp); 
} 

Usage:

assign($first, $second, $string); 

DEMO

Problemi correlati