2011-01-02 25 views
5

que tienen un resultado en forma de matriz a partir de una base de datos que se parece a:PHP manipular matriz multidimensional valores

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" 
    ) 
) 

¿cómo iba a aplicar una función para reemplazar los valores de una matriz únicamente en la clave de la matriz con b ? Normalmente, simplemente reconstruiría una nueva matriz con un bucle foreach y aplicaría la función si la clave de la matriz es b, pero no estoy seguro de si es la mejor manera. He intentado echar un vistazo a muchas funciones de matriz y parecía que array_walk_recursive es algo que podría usar, pero no tuve suerte en hacer que hiciera lo que quería. Si no estoy describiendo lo suficientemente bien, básicamente, quiero ser capaz de hacer lo que hace el código de abajo:

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

¿Debo seguir con eso, o hay una mejor manera?

Respuesta

3

Usando array_walk_recursive:

Si tiene PHP> = 5.3.0 (para anonymous functions):

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

De lo contrario algo como:

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

Gracias, ya había probado array_walk_recursive como dije anteriormente, pero no funcionó. ¡Al parecer, olvidé colocar el símbolo comercial antes del parámetro $ item! Trabajando ahora. – Joker

+0

Sí, error fácil de hacer. Citando el manual: 'Si funcname necesita trabajar con los valores reales de la matriz, especifique el primer parámetro de funcname como referencia. Entonces, cualquier cambio realizado en esos elementos se realizará en la matriz original en sí. " – thirtydot

0

No probado pero creo que esto funcionará.

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

La función se moverá a través de una matriz de comprobación de las claves para b. Si la clave apunta a una matriz, la sigue recursivamente.

+0

¿no es esto lo que hace 'array_walk_recursive'? –

+0

@Jacob: No estoy familiarizado con la sintaxis exacta de 'array_walk_recursive' y no me molesté en buscarlo. Escribir esto fue más rápido. –

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 función replacer puede ser excesiva. Puedes reemplazarlo por un literal o cualquier cosa que quieras.

+0

No estoy seguro de por qué alguien decidió rechazar su respuesta; me funcionó. Sin embargo, recomendaría limpiarlo, es decir, mencionar que la clave es pasar $ v como referencia y cambiar el código para imprimir los valores de inicio y fin, y por supuesto facilitar la lectura (sin usar funciones lambda innecesarias o lógica adicional como '$ k == 'b''). –

Cuestiones relacionadas