2012-04-16 26 views
5

tengo una matriz que tiene este aspectoActualización de una matriz multidimensional en 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 
     ) 
    } 

Quiero actualizar la matriz de cambiar "prometedor Widget" a 800 en lugar de 300.

Tenga en cuenta que el orden de esta matriz es arbitraria, lo que significa que necesito actualizar el valor basado en el valor del nombre del "producto" (no en su número en la matriz).

Estaba tratando de acceder a través del número en la matriz, pero me di cuenta de que no funcionaría por esa razón y no estoy seguro de cómo cambiar el valor de un elemento de una matriz multidimensional basada en otra.

Gracias por cualquier ayuda.

+0

intente esto ... recorra y busque el producto deseado y guarde la clave. ¿Entonces cambie el valor asociado con esa tecla? – WordsWorth

+1

¿Está generando esta matriz, puede cambiar la estructura? – Alex

+1

Como señaló @Alex, podría ser mejor usar un hash con la clave que es el Nombre del producto. Cada entrada sería un hash de propiedades. –

Respuesta

5

creo que tendría que bucle a través de ellos, algo así como:

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 
    } 
} 

Por lo tanto, recorrer la matriz, encontrar el valor que desee y luego cambiarlo. El &$value es para que la matriz se pase por referencia. Lo que significa que podemos editar directamente los valores en la matriz desde el bucle, sin tener que hacer $array[$key]['Value'].

+0

Pásame, exactamente el mismo código: o –

+0

Deberías agregar 'unset ($ value);' al final, ver el primer gran mensaje ** Aviso ** en [foreach, el manual] (http: // php .net/manual/es/control-structures.foreach.php) –

1

Esta respuesta podría ser demasiado tarde, pero enfrentado una serie de cuestiones similares que lo resuelve utilizando esta función

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

creo que la mayor enfoque universal es utilizar array_walk_recursive función de esa manera:

array_walk_recursive($array, 'updateValue'); 

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

De esta manera, incluso si va a cambiar su matriz más adelante en esta función, seguirá funcionando bien.

+0

seguramente no es el "enfoque más universal". Desde la página del manual: 'Cualquier clave que contenga una matriz no se pasará a la función. ' – CapelliC

Cuestiones relacionadas