compter la valeur occurance et grouper par date

Je reçois cette date à partir de la base de données

Array
(
[0] => Array
    (
        [page] => login
        [timestamp] => 2013-11-06 12:06:30
    )

[1] => Array
        [page] => changepage
        [timestamp] => 2013-11-06 12:06:31
    )

etc..

Je veux compter les entrées du même jour pour faire

Array
(
  [0] => Array
  (
  [timestamp] => 2013-11-06//only by the same day..
  [count] =>  4
  )
)

ou même

 Array
 (
   [0] => Array
   (
    [timestamp] => 2013-11-06
    [login] => 2
    [changepage] => 4
   )
 )

J'ai essayé

   function format($data)
{
    $dates = array();
    for ($i = 0; $i < count($data); $i++)
    {

    if ($data[$i]['page'] == 'login')
        {
            if (!isset($dates[explode(' ', $data[$i]['timestamp'])[0]]))
                array_push($dates, array('date' => explode(' ', $data[$i]['timestamp'])[0], 'login' => 1));
            else
            {
                foreach ($dates as $date) {
                    if ($date['date'] == explode(' ', $data[$i]['timestamp'])[0])
                        $date['login'] += 1;
                         }
            }
        }
        return $dates;
    }

mais cela ne me donne qu'un seul record de

    Array( Array ( 'timestamp' => '2013-11-06', 'login' => 1) )

En conclusion je veux additionner les entrées avec le même jour et la même page (Ma meilleure solution serait d'obtenir 2 tableaux avec la somme de toutes les pages et un avec la somme des pages détaillées)

0
mis à jour avec mon code ..
ajouté l'auteur j0shyz, source
Montre-nous ce que tu as déjà essayé
ajouté l'auteur u_mulder, source

1 Réponses

Voici la solution à votre question:

function format($data) {
  $result = array();
  foreach ($data as $item) {
    $date = substr($item['timestamp'], 0, 10);
    @$result[$date]['timestamp'] = $date;
    @$result[$date][$item['page']]++;
  }
  sort($result);
  return $result;
}

Pour chaque élément du tableau, il tronque d'abord la partie temporelle du champ timestamp en utilisant substr . Utilisez la valeur de date comme clé du tableau des résultats, ajoutez un champ timestamp en utilisant cette même valeur de date et augmentez la valeur des autres champs (contenant les noms de page). J'utilise @ operator ici pour éviter l'erreur Notice quand la clé (index) n'existe pas encore.

Une fois que tous les éléments ont été traités, triez le tableau de résultat pour changer les clés en index numériques et il devient un tableau régulier.

Voici le test que je cours:

$data = array(
  array(
    'page' => 'login',
    'timestamp' => '2013-11-06 12:06:30'
  ),
  array(
    'page' => 'changepage',
    'timestamp' => '2013-11-06 12:06:45'
  ),
  array(
    'page' => 'login',
    'timestamp' => '2013-11-06 13:06:30'
  ),
  array(
    'page' => 'changepage',
    'timestamp' => '2013-11-06 14:06:45'
  ),
  array(
    'page' => 'changepage',
    'timestamp' => '2013-11-06 14:06:50'
  ),
  array(
    'page' => 'login',
    'timestamp' => '2013-11-07 12:06:30'
  ),
  array(
    'page' => 'changepage',
    'timestamp' => '2013-11-07 12:06:45'
  )
);

print_r(format($data));

Anda la sortie est:

Array
(
    [0] => Array
        (
            [timestamp] => 2013-11-06
            [login] => 2
            [changepage] => 3
        )

    [1] => Array
        (
            [timestamp] => 2013-11-07
            [login] => 1
            [changepage] => 1
        )

)

Là, j'espère que ça aide!

0
ajouté