2011-01-02 20 views
5

Ho un set di risultati come un array da un database che assomiglia:PHP manipolare array multidimensionale valori

array (
    0 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
    1 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
    2 => array (
     "a" => "something" 
     "b" => "something" 
     "c" => "something" 
    ) 
) 

Come dovrei applicare una funzione per sostituire i valori di un array solo sul tasto array con b ? Normalmente vorrei solo ricostruire un nuovo array con un ciclo foreach e applicare la funzione se il codice dell'array è b, ma non sono sicuro che sia il modo migliore. Ho provato a dare un'occhiata a molte funzioni di array e sembrava che array_walk_recursive fosse qualcosa che potrei usare, ma non ho avuto fortuna nel fargli fare quello che volevo. Se io non sto descrivendo abbastanza bene, in fondo io voglio essere in grado di fare come il codice qui sotto fa:

$arr = array(); 
foreach ($result as $key => $value) 
{ 
    foreach ($value as $key2 => $value2) 
    { 
     $arr[$key][$key2] = ($key2 == 'b' ? $this->_my_method($value2) : $value2); 
    }  
} 

Devo bastone con quello, o c'è un modo migliore?

risposta

3

Utilizzando array_walk_recursive:

Se si dispone di PHP> = 5.3.0 (per anonymous functions):

array_walk_recursive($result, function (&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
}); 

Altrimenti qualcosa di simile:

function _my_method(&$item, $key) { 
    if ($key == 'b') { 
     $item = 'the key is b!'; 
    } 
} 
array_walk_recursive($result, '_my_method'); 
+0

Grazie, avevo già provato array_walk_recursive come ho detto sopra, ma non ha funzionato. A quanto pare ho dimenticato di posizionare la e commerciale prima del parametro $ item! Funzionando ora. – Joker

+0

Sì, errore facile da fare. Citando il manuale: 'Se funcname deve funzionare con i valori effettivi dell'array, specificare il primo parametro di funcname come riferimento. Quindi, tutte le modifiche apportate a tali elementi verranno apportate nell'array originale stesso. – thirtydot

0

Non testato, ma penso che funzionerà.

function replace_b (&$arr) 
{ 
    foreach ($arr as $k => $v) 
    { 
     if ($k == 'b') 
     { 
      /* Do something */ 
     } 
     if (is_array($v) 
     { 
      replace_b($arr[$k]); 
     } 
    } 
} 

La funzione si sposta attraverso un array controllando i tasti per b. Se la chiave punta a un array, la segue in modo ricorsivo.

+0

non è ciò che già 'array_walk_recursive' fa? –

+0

@Jacob: Non ho familiarità con la sintassi esatta di 'array_walk_recursive' e non mi sono preoccupato di cercarlo. Digitando questo è stato più veloce. –

0

uso array_walk_recursive documented here

$replacer = function($x) {return "I used to be called $x";}; //put what you need here 
$replaceB = function(&$v, $k) use ($replacer) {if ($k === 'b') $v = $replacer($v);}; 

array_walk_recursive($arr, $replaceB); 

La funzione replacer potrebbe essere eccessiva. Puoi sostituirlo con un valore letterale o qualsiasi cosa tu voglia.

+0

Non sono sicuro del motivo per cui qualcuno ha deciso di downvotare la risposta: ha funzionato per me. Raccomanderei comunque di ripulirlo, vale a dire che la chiave è di passare $ v come riferimento e cambiare il codice per stampare i valori di inizio e fine, e ovviamente renderlo più facile da leggere (non usando funzioni lambda non necessarie o logica aggiuntiva come '$ k == 'b''). –

Problemi correlati