Group the values of a PHP array according to the same key.

0

Good afternoon guys, I know the question may seem repetitive, but I'm already looking for the solution to my case, especially here in #stack.

I have the following Array () :

array (size=9)
'Janeiro' => 
array (size=54)
  0 => 
    array
      'nome' => string 'Pessoa1' 
      'valor' => string '9' 
  1 => 
    array
      'nome' => string 'Pessoa2' 
      'valor' => string '2' 
  2 => 
    array
      'nome' => string 'Pessoa1' 
      'valor' => null 
  3 => 
    array
     'nome' => string 'Pessoa2' 
      'valor' => null
  4 => 
    array
      'nome' => string 'Pessoa3' 
      'valor' => null 
'Fevereiro' => 
 array
  0 => 
    array
      'nome' => string 'Pessoa1' (
      'valor' => string '28' 
  1 => 
    array
      'nome' => string 'Pessoa2' 
      'valor' => string '17' (length=2)
  2 => 
    array
      'nome' => string 'Pessoa3' 
      'valor' => string '2' (length=1)
  3 => 
    array
      'nome' => string 'Pessoa1' 
      'valor' => null
  4 => 
    array
      'nome' => string 'Pessoa2' 
      'valor' => null
  5 => 
    array
      'nome' => string 'Pessoa3' 
      'valor' => null
  6 => 
    array
      'nome' => string 'Pessoa4' 
      'valor' => null

... And so on containing every month currently. I'm trying to return an array that looks like this:

 array
'Pessoa1' => 
array
  meses => v1,v2,v3,v4,v5,v6,v7,v8,v9 
   array
'Pessoa2' => 
array
  meses => v1,v2,v3,v4,v5,v6,v7,v8,v9 

And so on picking up all "People", only that as shown in exe. has month that the value of the person is null and has month that it has value, so I need to keep the values null, ex [null, null, 2,3,4,5,6, null, null]

    
asked by anonymous 18.09.2018 / 22:57

1 answer

2

Following the structure of the presented array you can follow a simple iteration in the data and build the future array:

<?php

$registroGeral = [
    'Janeiro' => [
        [
            'nome' => 'Pessoa1',
            'valor' => '9'
        ],
        [
            'nome' => 'Pessoa2',
            'valor' => '2' 
        ],
        [
            'nome' => 'Pessoa1',
            'valor' => null 
        ]
    ],
    'Fevereiro' => [
        [
            'nome' => 'Pessoa1',
            'valor' => '28',
        ],
        [
            'nome' => 'Pessoa2',
            'valor' => '17',
        ],
        [
            'nome' => 'Pessoa3',
            'valor' => '2',
        ],
        [
            'nome' => 'Pessoa1',
            'valor' => null,
        ],
        [
            'nome' => 'Pessoa2',
            'valor' => null,
        ],
        [
            'nome' => 'Pessoa3',
            'valor' => null,
        ],
        [
            'nome' => 'Pessoa4',
            'valor' => null,
        ]
    ]
];

$frequenciaParticipante = [];
foreach ($registroGeral as $mes => $registros) {
    foreach ($registros as $registro) {
        if (!array_key_exists($registro['nome'], $frequenciaParticipante)) {
            $frequenciaParticipante[$registro['nome']] = [];
        }

        if (!in_array($mes, $frequenciaParticipante[$registro['nome']])) {
            $frequenciaParticipante[$registro['nome']][] = $mes;
        }
    }
}

var_dump($frequenciaParticipante); exit;

The end result will look like this:

array(4) {
  'Pessoa1' =>
  array(2) {
    [0] =>
    string(7) "Janeiro"
    [1] =>
    string(9) "Fevereiro"
  }
  'Pessoa2' =>
  array(2) {
    [0] =>
    string(7) "Janeiro"
    [1] =>
    string(9) "Fevereiro"
  }
  'Pessoa3' =>
  array(1) {
    [0] =>
    string(9) "Fevereiro"
  }
  'Pessoa4' =>
  array(1) {
    [0] =>
    string(9) "Fevereiro"
  }
}

At the end, just manipulate the participant's months as you like

    
19.09.2018 / 16:02