Antecedentes: Trevor está trabajando con una implementación PHP de un algoritmo estándar: toma un conjunto principal de pares nombre-valor predeterminados y actualiza esos pares nombre-valor, pero solo para aquellos pares nombre-valor donde realmente existe un valor de actualización válido.
Problema: de forma predeterminada, PHP array_merge funciona así … sobrescribirá un valor no en blanco con un valor en blanco.
$aamain = Array('firstname'=>'peter','age'=>'32','nation'=>''); $update = Array('firstname' => '','lastname' => 'griffin', age =>'33','nation'=>'usa'); print_r(array_merge($aamain,$update)); /* Array ( [firstname] => // 33 // griffin // usa // <-- update filled in a blank, thats cool. ) */
Pregunta: ¿Cuál es la menor manera de hacer arreglos de arreglos de líneas-de-código donde los valores en blanco nunca sobrescriben los valores ya existentes?
print_r(array_coolmerge($aamain,$update)); /* Array ( [firstname] => peter // 33 [lastname] => griffin [nation] => usa ) */
ACTUALIZACIÓN: 2016-06-17T11: 51: 54 la pregunta se actualizó aclarando el contexto y cambiando el nombre de las variables.
Bueno, si quieres una forma “inteligente” de hacerlo, aquí está, pero puede no ser tan legible como simplemente hacer un ciclo.
$merged = array_merge(array_filter($foo, 'strval'), array_filter($bar, 'strval'));
editar: o usando + …
Prueba esto:
$merged = array_map( create_function('$foo,$bar','return ($bar?$bar:$foo);'), $foobar,$feebar );
No es la solución más legible, pero debería reemplazar solo los valores no vacíos, independientemente del orden en que se pasen las matrices.
Ajústese a sus necesidades:
# Replace keys in $foo foreach ($foo as $key => $value) { if ($value != '' || !isset($bar[$key])) continue; $foo[$key] = $bar[$key]; } # Add other keys in $bar # Will not overwrite existing keys in $foo $foo += $bar;
esquí a y explosiones Prueba Polvo Deportes Aire Viento Gafas Ciclismo B Lentes Libre de al array_replace_recursive($array, $array2);
Esta es la solución.
Esto colocará duplicados en una nueva matriz, aunque no sé si esto es lo que quieres.
B a de Gafas esquí Viento Deportes Aire Prueba Ciclismo explosiones Polvo y al Lentes Libre < ?php $foobar = Array('firstname' => 'peter','age' => '33',); $feebar = Array('firstname' => '','lastname' => 'griffin',); $merged=$foobar; foreach($feebar as $k=>$v){ if(isset($foobar[$k]))$merged[$k]=array($v,$foobar[$k]); else $merged[$k]=$v; } print_r($merged); ?>
Esto simplemente asegurará que feebar nunca borrará un valor en foobar:
< ?php $foobar = Array('firstname' => 'peter','age' => '33',); $feebar = Array('firstname' => '','lastname' => 'griffin',); $merged=$foobar; foreach($feebar as $k=>$v) if($v)$merged[$k]=$v; print_r($merged); ?>
o por supuesto,
al Gafas de B esquí Deportes Libre Prueba Aire a Lentes Ciclismo Viento Polvo explosiones y Viento Deportes Aire B esquí Polvo Ciclismo al de explosiones Libre Lentes Prueba Gafas y a < ? function cool_merge($array1,$array2){ $result=$array1; foreach($array2 as $k=>$v) if($v)$result[$k]=$v; return $result; } $foobar = Array('firstname' => 'peter','age' => '33',); $feebar = Array('firstname' => '','lastname' => 'griffin',); print_r(cool_merge($foobar,$feebar)); ?>
Si también desea mantener los valores que están en blanco en ambas matrices:
array_filter($foo) + array_filter($bar) + $foo + $bar