2012-04-16 17 views
5

Ho una matrice che assomiglia a questoAggiornamento di un array multidimensionale in PHP

$array = 
    Array 
    (
    [0] => Array 
     (
      [Product] => Amazing Widget 
      [Value] => 200 
     ) 

    [1] => Array 
     (
      [Product] => Super Amazing Widget 
      [Value] => 400 
     ) 

    [2] => Array 
     (
      [Product] => Promising Widget 
      [Value] => 300 
     ) 

    [3] => Array 
     (
      [Product] => Superb Widget 
      [Value] => 400 
     ) 
    } 

voglio aggiornare la matrice di cambiare "Promettente Widget" a 800 invece di 300.

Nota che l'ordine di questo array è arbitrario, il che significa che ho bisogno di aggiornare il valore basato sul valore del nome "Prodotto" (non sul suo numero nell'array).

Stavo cercando di accedervi tramite il numero nell'array ma ho capito che non avrebbe funzionato per quel motivo e non sono sicuro di come cambiare il valore di un elemento di un array multidimensionale basato su un altro.

Grazie per qualsiasi aiuto.

+0

provare this..loop attraverso e cercare il prodotto desiderato e salvare la sua chiave. Quindi modificare il valore associato a quella chiave? – WordsWorth

+1

stai generando questo array, puoi cambiare la struttura? – Alex

+1

Come notato da @Alex, potrebbe essere preferibile utilizzare un hash con la chiave come Nome prodotto. Ogni voce sarebbe un hash di proprietà. –

risposta

5

penso che avrei dovuto ciclo attraverso di loro, qualcosa di simile a:

foreach ($array as $k => $v) { 
    if ($v['Product']=='Promising Widget') { 
    $array[$k]['Value']=800; 
    } 
} 
17
foreach($array as &$value){ 
    if($value['Product'] === 'Promising Widget'){ 
     $value['Value'] = 800; 
     break; // Stop the loop after we've found the item 
    } 
} 

Quindi, si esegue un ciclo attraverso l'array, trovare il valore che vuoi, poi cambiarlo. Il &$value è così la matrice è passata per riferimento. Significa che possiamo modificare direttamente i valori nella matrice dal ciclo, senza dover fare $array[$key]['Value'].

+0

Picchiami, esatto stesso codice: o –

+0

Dovresti aggiungere "unset ($ value);" alla fine, vedi il primo grande ** Warning ** rosso in [foreach, il manuale] (http: // php .net/manual/it/control-structures.foreach.php) –

1

Questa risposta potrebbe essere troppo tardi, ma ho affrontato un problemi simili che ho risolto utilizzando questa funzione

function r_search_and_replace(&$arr) { 
    foreach ($arr as $idx => $_) { 
     if(is_array($_)) r_search_and_replace($arr[$idx]); 
     else { 
      if(is_string($_)) $arr[$idx] = str_replace("PATTERN", "REPLACEMENT", $_); 
     } 
    } 
} 
4

Penso che la maggior parte approccio universale è quello di utilizzare array_walk_recursive funzione del genere:

array_walk_recursive($array, 'updateValue'); 

function updateValue(&$data, $key) { 
    if($key == 'Promising Widget') { 
    $data = 800; 
    } 
} 

In questo modo, anche se cambierai il tuo array in seguito, questa funzione funzionerà comunque bene.

+0

sicuramente non l '"approccio più universale". Dalla pagina di manuale: 'Qualsiasi chiave che contiene una matrice non verrà passata alla funzione. ' – CapelliC

Problemi correlati