es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo contar la suma de valores de los objetos JSON en ciertos subdirectorios por separado.

Tengo 3 directorios llamados “september”, “october” y “november” en el directorio principal “2021”. En estos 3 directorios hay archivos json que se ven así:
{
“id”: “id_2021-09-05_2200”,
“date”: “2021-09-05”,
“guests”: 32 //total de invitados para ese día
}

Para cada mes, necesito la suma de todos los “guests” de ese mes. (contar todos los invitados de todos los archivos json en ese mes juntos).

Tengo este código hasta ahora pero me quedo atascado al contar para cada mes:

$monthdirs = array_filter(glob(‘data/2021/‘), ‘is_dir’); // lee todos los directorios de mes en el año 2021
foreach($monthdirs as $monthdir) {
$monthfiles = glob($monthdir.’/
.json’); // todos los archivos json en un mes específico
}
foreach($monthfiles as $monthfile) {
$arr[] = json_decode(file_get_contents($monthfile),true); // array asociativo de php
foreach($arr as $key => $val) {
$tot_guests_monthes[] += $val[‘guests’]; // nuevo array a partir de cada mes con la suma de invitados de todos los archivos json en dicho mes
}
}
foreach($tot_guests_monthes as $tot_guests_month) {
echo $tot_guests_month.’
‘;
}

Creo que en el segundo bucle foreach estoy haciendo algo mal. Mi resultado final debería ser 3 valores, algo así:
200 // todos los invitados de septiembre
300 // todos los invitados de octubre
400 // todos los invitados de noviembre

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para calcular la suma de todos los invitados para cada mes, puede modificar el código de la siguiente manera:

    $monthdirs = array_filter(glob('data/2021/*'), 'is_dir'); // lee todos los directorios de meses en el año 2021
    foreach($monthdirs as $monthdir) {
        $monthfiles = glob($monthdir.'/*.json');    // todos los archivos json en un mes específico
        $tot_guests = 0;
        foreach($monthfiles as $monthfile) {
            $data = json_decode(file_get_contents($monthfile), true); // arreglo asociativo de php
            $tot_guests += $data['guests'];   // agrega invitados de este archivo a los invitados totales de este mes
        }
        $month_name = basename($monthdir); // obtener el nombre del directorio del mes
        $tot_guests_monthes[$month_name] = $tot_guests; // almacena los invitados totales para este mes
    }
    foreach($tot_guests_monthes as $month_name => $tot_guests) {
        echo $tot_guests . ' // todos los invitados ' . $month_name . '<br>';
    }
    

    Esto debería brindarle la salida deseada:

    200 // todos los invitados septiembre
    300 // todos los invitados octubre
    400 // todos los invitados noviembre
    

    En el código modificado, se itera sobre cada directorio de mes y para cada mes, se calcula el número total de invitados sumando los invitados de todos los archivos json de ese mes. Luego, se almacenan los invitados totales para cada mes en un arreglo asociativo, utilizando el nombre del mes como clave. Finalmente, se itera sobre el arreglo e imprime los invitados totales para cada mes.

Comments are closed.