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 filtrar un array único y sumar los duplicados en php?

Viene de una API, así que no tengo ningún control sobre ella.

He utilizado json_decode($response, true) antes de obtener este resultado:

Array
(
[0] => Array
(
[status] => ok
[res] => Array
(
[0] => Array
(
[id] => C_6
[image_url] => https://www.example.com/pic.png
[cat_id] => F_1
[cat_name] => Mariscos
[date] => 2020-11-09 22:02:56
)

                [1] => Array
                    (
                        [id] => C_6
                        [image_url] => https://www.example.com/pic1.png
                        [cat_id] => F_1
                        [cat_name] => Mariscos
                        [date] => 2020-11-09 12:12:20
                    )

                [2] => Array
                    (
                        [id] => C_6
                        [image_url] => https://www.example.com/pic2.png
                        [cat_id] => F_2
                        [cat_name] => Plato Europeo
                        [date] => 2020-11-09 20:05:62
                    )
            )
        [none] => 
    )

)

Ahora quiero filtrar el resultado en base a la singularidad de este elemento [date], y solo quiero que todas las fechas sean únicas y los valores duplicados se sumen de esta manera:

Hay 2 “Mariscos” con la misma fecha pero con marcas de tiempo diferentes (eso lo he descubierto al descomponerlo y sacar solo la fecha).

Pero solo quiero considerar duplicados aquellos que tienen la misma fecha para la misma categoría (como Mariscos).

Si en algún caso hay 3 arrays con 2 fechas iguales y una fecha diferente pero la misma categoría, entonces será 2~1ª fecha y 1~2ª fecha.

Mariscos-2020-11-09 + Mariscos-2020-11-09 = 2 Mariscos el 2020-11-09

Entonces, en total es:
2 Mariscos, 1 Plato Europeo

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para filtrar el resultado basado en la unicidad del elemento date y sumar los valores duplicados, puedes seguir estos pasos:

    1. Crear un array vacío para almacenar el resultado filtrado.
    2. Recorrer el array original usando un bucle foreach.
    3. Obtener los elementos date y cat_name de cada subarray usando $item['date'] y $item['cat_name'].
    4. Separar la cadena date en fecha y hora utilizando $date_arr = explode(' ', $item['date']).
    5. Mantener solo el elemento de fecha del array obtenido usando $date = $date_arr[0].
    6. Comprobar si la combinación de date y cat_name ya existe en el array filtrado utilizando array_key_exists($date.'_'.$cat_name, $filtered_arr).
    7. Si no existe, agregar el elemento al array filtrado con una cuenta de 1 utilizando $filtered_arr[$date.'_'.$cat_name] = array('cat_name' => $cat_name, 'date' => $date, 'count' => 1).
    8. Si existe, incrementar la cuenta del elemento existente utilizando $filtered_arr[$date.'_'.$cat_name]['count']++.
    9. Finalmente, recorrer el array filtrado e imprimir el resultado en el formato deseado.

    Aquí tienes el código en PHP para implementar los pasos anteriores:

    $response = '...'; // array original como se muestra en la pregunta
    
    $decoded_arr = json_decode($response, true);
    
    $filtered_arr = array();
    
    foreach ($decoded_arr[0]['res'] as $item) {
        $cat_name = $item['cat_name'];
        $date_arr = explode(' ', $item['date']);
        $date = $date_arr[0];
        if (array_key_exists($date.'_'.$cat_name, $filtered_arr)) {
            $filtered_arr[$date.'_'.$cat_name]['count']++;
        } else {
            $filtered_arr[$date.'_'.$cat_name] = array('cat_name' => $cat_name, 'date' => $date, 'count' => 1);
        }
    }
    
    foreach ($filtered_arr as $item) {
        echo $item['cat_name'].'-'.$item['date'].' x '.$item['count'].'<br>';
    }
    

    Esto imprimirá:

    Sea Food-2020-11-09 x 2
    European Dish-2020-11-09 x 1
    

    Ten en cuenta que puedes ajustar el formato de la salida para que coincida con tus requisitos específicos.

Comments are closed.