Fusionando y sumando matrices multidimensionales -- php campo con array campo con php5 campo con iteration camp codereview Relacionados El problema

Merging and summing multi-dimensional arrays


1
vote

problema

Español

Me he encontrado hoy realmente luchando con este tema y estoy bastante seguro de que debe haber una mejor manera de hacer esto.

En primer lugar, mis matrices tienen el mismo diseño, necesito combinarlas y suma cada valor por dominio .

Déjame darte un ejemplo:

  $array[0]['X1']['Y1'] = 1; $array[0]['X1']['Y2'] = 2; $array[0]['INFO']['DOMAIN'] = 'example1.com';  $array[1]['X1']['Y1'] = 1; $array[1]['X1']['Y2'] = 2; $array[1]['INFO']['DOMAIN'] = 'example1.com';  $array[2]['X1']['Y1'] = 2; $array[2]['X1']['Y2'] = 5; $array[2]['INFO']['DOMAIN'] = 'example2.com';  $array[3]['X1']['Y1'] = 2; $array[3]['X1']['Y2'] = 5; $array[3]['INFO']['DOMAIN'] = 'example2.com';   

Necesito producir la siguiente nueva matriz:

  $mergedArray[0]['X1']['Y1'] = 2; $mergedArray[0]['X1']['Y2'] = 4; $mergedArray[0]['INFO']['DOMAIN'] = 'example1.com';   $mergedArray[1]['X1']['Y1'] = 4; $mergedArray[1]['X1']['Y2'] = 10; $mergedArray[1]['INFO']['DOMAIN'] = 'example2.com';    

Estoy usando el siguiente código para lograr esto (perdóname por los malas nombres).

  foreach($array as $subKey => $subValue) {     foreach($subValue as $key => $value) {         foreach($value as $key2 => $value2) {             if($key2=='DOMAIN' && !isset($merged[$value2])) {                 $merged[$value2] = $subValue;             } else if ($key2=='DOMAIN' && isset($merged[$value2])) {                 foreach($subValue as $key3=>$value3) {                     foreach($value3 as $key4=>$value4) {                         if($key4!='DOMAIN')                              $merged[$value2][$key3][$key4] += $value4;                     }                 }             }         }     } }   

¿Cómo podría mejorar esta pieza de código?

Original en ingles

I've found myself today really struggling with this subject and I'm pretty sure that there must be a better way to do this.

First of all my arrays have the same layout, I need to merge them and sum every value by domain.

Let me give you an example:

$array[0]['X1']['Y1'] = 1; $array[0]['X1']['Y2'] = 2; $array[0]['INFO']['DOMAIN'] = 'example1.com';  $array[1]['X1']['Y1'] = 1; $array[1]['X1']['Y2'] = 2; $array[1]['INFO']['DOMAIN'] = 'example1.com';  $array[2]['X1']['Y1'] = 2; $array[2]['X1']['Y2'] = 5; $array[2]['INFO']['DOMAIN'] = 'example2.com';  $array[3]['X1']['Y1'] = 2; $array[3]['X1']['Y2'] = 5; $array[3]['INFO']['DOMAIN'] = 'example2.com'; 

I need to produce the following new array:

$mergedArray[0]['X1']['Y1'] = 2; $mergedArray[0]['X1']['Y2'] = 4; $mergedArray[0]['INFO']['DOMAIN'] = 'example1.com';   $mergedArray[1]['X1']['Y1'] = 4; $mergedArray[1]['X1']['Y2'] = 10; $mergedArray[1]['INFO']['DOMAIN'] = 'example2.com';  

I'm using the following code to achieve this (forgive me for the bad namings).

foreach($array as $subKey => $subValue) {     foreach($subValue as $key => $value) {         foreach($value as $key2 => $value2) {             if($key2=='DOMAIN' && !isset($merged[$value2])) {                 $merged[$value2] = $subValue;             } else if ($key2=='DOMAIN' && isset($merged[$value2])) {                 foreach($subValue as $key3=>$value3) {                     foreach($value3 as $key4=>$value4) {                         if($key4!='DOMAIN')                              $merged[$value2][$key3][$key4] += $value4;                     }                 }             }         }     } } 

How could I improve this piece of code?

           
   
   

Lista de respuestas

2
 
vote

Suponiendo que el formato será consistente, podría eliminar un bucle 9988776666555443318 y extraer el dominio que se usa como la clave de la matriz fusionada, y también solo establece la submarina (con llaves < CÓDIGO> pagetext9 , pagetext0 pagetext1 ) O agregue a los elementos de la Sub Array.

  pagetext2  

Véalo en acción en este ejemplo del patio de juegos .

Un enfoque funcional también podría emplearse usando pagetext3 :

  pagetext4  

Véalo en acción en este ejemplo del patio de juegos

 

Presuming that the format will be consistent, you could remove one foreach loop and extract the domain to use as the key of the merged array, and also only either set the sub array (with keys X1, Y1 and Y2) or add to the sub array items.

foreach($array as $subArray) {     if (isset($subArray['INFO']) && isset($subArray['INFO']['DOMAIN'])) {         $domainKey = $subArray['INFO']['DOMAIN'];         if (!isset($merged[$domainKey])) {             $merged[$domainKey] = $subArray;         }         else { // could add conditionals to ensure X1 is set on $subArray             foreach($subArray['X1'] as $key => $value) {                 $merged[$domainKey]['X1'][$key] += $value;             }         }     } } 

See it in action in this playground example.

A functional approach could also be employed by using array_reduce():

$merged = array_reduce($array, function($cumulative, $subArray) {     if (isset($subArray['INFO']) && isset($subArray['INFO']['DOMAIN'])) {         $domainKey = $subArray['INFO']['DOMAIN'];         if (!isset($cumulative[$domainKey])) {             $cumulative[$domainKey] = $subArray;         }         else { // could add conditionals to ensure X1 is set on $subArray             foreach($subArray['X1'] as $key => $value) {                 $cumulative[$domainKey]['X1'][$key] += $value;             }         }     }     return $cumulative; }, []); 

See it in action in this playground example

 
 

Relacionados problema

5  Código conciso para realizar la acción en cada elemento, cuando necesita índice  ( Concise code to perform action on every element when need index ) 
Cuando leí esta respuesta , que tiene código: linqObject.Where((obj, index) => { DoWork(obj, index); return true; }).ToArray(); //MUST CALL ToArray() ...

1  Visualización de datos trazados en orden serpentino  ( Displaying plotted data in serpentine order ) 
Tengo que mostrar un conjunto de: datos en orden serpentina. En un experimento hay replicación, gama y parcela. Las repeticiones contienen una parcela. U...

3  COORDINANTE MOVIMIENTO DE ETAPA DE CÁMARA Y LECTURATO DE DATOS  ( Coordinating camera stage movement and data readout ) 
El propósito de este código es importante, por lo que aquí hay un resumen rápido. Este código funciona controla una máquina física que utiliza una cámara y ...

38  ¿Realizar instrucciones en bucle cada vez excepto la última vez?  ( Perform instruction in loop every time except the last time ) 
El problema específico es esto: estoy escribiendo a un archivo y quiero generar una nueva línea después de que se escriba cada línea. Si uso un bucle normal s...

4  Algoritmo tic tac toe usando las esterlinas  ( Tic tac toe algorithm using itertools ) 
Estoy buscando comentarios sobre la legibilidad de mi código y opiniones sobre el algoritmo Pick_Best. Hago esto para divertirme cuando tenga tiempo, y nunca ...

4  Tic-Tac-Toe en Python 2.x  ( Tic tac toe in python 2 x ) 
Esta es una clase llamada $db = new db; $user = $db->smartQuery(array( 'sql' => "SELECT UserName FROM `post` WHERE UserUID = :uid", 'par' => array('u...

5  Iterador para generar todas las palabras (de palabras dadas) que se cambian  ( Iterator to generate all the words of a given words that are one change away ) 
Estoy tratando de crear un iterador, que generará todas las palabras que se cambian. Por ejemplo, si mi entrada es "SAM", debería obtener las siguientes pal...

5  Python List Dictionary Artículos Redondos Robin Mezcla  ( Python list dictionary items round robin mixing ) 
Tengo una lista de diccionarios, lo que quiero hacer una mezcla de round robin. sample = [ {'source': 'G', '"serial"': '0'}, {'source': 'G', '"seri...

2  Fusionar ocurrencias adyacentes de elementos idénticos en la recopilación de datos  ( Merge adjacent occurrences of identical elements in data collection ) 
Hay una pequeña Ejercicio de programación para fusionar elementos idénticos adyacentes en una colección. Aquí hay dos soluciones (Pasando las pruebas de...

6  Permutaciones de impresión de forma iterativa  ( Print permutations in an iterative way ) 
He escrito el siguiente código para imprimir todas las permutaciones de una lista. Por ejemplo: $ [1, 2, 3] $ tiene estas permutaciones: $ [1,2,3] $, ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos