-1

I have an array that needs to be rearranged for a single array.

I have broken my head and tried several solutions, but so far I do not have a solution for my problem.

How is it possible to rearrange a multidimensional array in PHP?

I have this array:

Array
(
    [0] => Array
        (
            [pais_codigo] => UK
            [pista_nome] => LINGFIELD
            [corrida_hora] => 13:50:00
        )
[1] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 14:20:00
    )

[2] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 14:55:00
    )

[3] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 15:25:00
    )

[4] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 16:00:00
    )

[5] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 16:30:00
    )

[6] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 17:00:00
    )

[7] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => LINGFIELD
        [corrida_hora] => 17:35:00
    )

[8] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 14:00:00
    )

[9] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 14:35:00
    )

[10] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 15:05:00
    )

[11] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 15:40:00
    )

[12] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 16:10:00
    )

[13] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 16:40:00
    )

[14] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 17:10:00
    )

[15] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NEWCASTLE
        [corrida_hora] => 17:45:00
    )

[16] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 14:10:00
    )

[17] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 14:45:00
    )

[18] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 15:15:00
    )

[19] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 15:50:00
    )

[20] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 16:20:00
    )

[21] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 16:50:00
    )

[22] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 17:20:00
    )

[23] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => NOTTINGHAM
        [corrida_hora] => 17:55:00
    )

[24] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 17:15:00
    )

[25] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 17:50:00
    )

[26] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 18:20:00
    )

[27] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 18:50:00
    )

[28] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 19:20:00
    )

[29] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 19:50:00
    )

[30] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 20:20:00
    )

[31] => Array
    (
        [pais_codigo] => IRE
        [pista_nome] => KILLARNEY
        [corrida_hora] => 20:50:00
    )

[32] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 17:25:00
    )

[33] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 18:00:00
    )

[34] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 18:30:00
    )

[35] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 19:00:00
    )

[36] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 19:30:00
    )

[37] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 20:00:00
    )

[38] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => HUNTINGDON
        [corrida_hora] => 20:30:00
    )

[39] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 17:40:00
    )

[40] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 18:10:00
    )

[41] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 18:40:00
    )

[42] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 19:10:00
    )

[43] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 19:40:00
    )

[44] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 20:10:00
    )

[45] => Array
    (
        [pais_codigo] => UK
        [pista_nome] => WETHERBY
        [corrida_hora] => 20:40:00
    )

)

and would like to make it:

    Array
(
    [0] => UK
    [1] => Lingfield
    [2] => 13:50
    [3] => 14:20
    [4] => 14:55
    [5] => 15:25
    [6] => 16:00
    [7] => 16:30
    [8] => 17:00
    [9] => 17:35
    [10] => UK
    [11] => Newcastle
    [12] => 14:00
    [13] => 14:35
    [14] => 15:05
    [15] => 15:40
    [16] => 16:10
    [17] => 16:40
    [18] => 17:10
    [19] => 17:45
    [20] => UK
    [21] => Nottingham
    [22] => 14:10
    [23] => 14:45
    [24] => 15:15
    [25] => 15:50
    [26] => 16:20
    [27] => 16:50
    [28] => 17:20
    [29] => 17:55
    [30] => IRE
    [31] => Killarney
    [32] => 17:15
    [33] => 17:50
    [34] => 18:20
    [35] => 18:50
    [36] => 19:20
    [37] => 19:50
    [38] => 20:20
    [39] => 20:50
    [40] => UK
    [41] => Huntingdon
    [42] => 17:25
    [43] => 18:00
    [44] => 18:30
    [45] => 19:00
    [46] => 19:30
    [47] => 20:00
    [48] => 20:30
    [49] => UK
    [50] => Wetherby
    [51] => 17:40
    [52] => 18:10
    [53] => 18:40
    [54] => 19:10
    [55] => 19:40
    [56] => 20:10
    [57] => 20:40
)

What is the purpose? Building a table similar to this:

My Table Final

Ian
  • 30,182
  • 19
  • 69
  • 107
  • 2
    Why is this question tagged [tag:mysql]? If the data originates there, there's probably a better solution than using PHP arrays. – eggyal May 17 '16 at 20:13
  • 1
    Possible duplicate of [Turning multidimensional array into one-dimensional array](http://stackoverflow.com/questions/8611313/turning-multidimensional-array-into-one-dimensional-array) – manniL May 17 '16 at 20:17
  • Do you really need to have this data organized that way in the array, or you just want to display/print it in the presented way? – michaJlS May 17 '16 at 20:17
  • Possible duplicate of [Rearranging multidimensional array](http://stackoverflow.com/questions/9613223/rearranging-multidimensional-array) – Hossein May 17 '16 at 20:20
  • use this question http://stackoverflow.com/questions/9613223/rearranging-multidimensional-array – Hossein May 17 '16 at 20:20
  • Just as easy to loop thru the original array and build that table. – AbraCadaver May 17 '16 at 20:29

1 Answers1

0

I think this is not really good idea, but just for the sake of answering you question. You can do something like this:

$pais_codigo = null;
$pista_nome = null;

$result = array_reduce($array, function($carry, $elem) use (&$pais_codigo, &$pista_nome) {
    if ($pais_codigo != $elem['pais_codigo'] || $pista_nome !=  $elem['pista_nome']) {
        $carry = array_merge(
            $carry,
            [
                $elem['pais_codigo'],
                $elem['pista_nome'],
            ]
        );

        $pais_codigo = $elem['pais_codigo'];
        $pista_nome = $elem['pista_nome'];
    }

    return array_merge(
        $carry,
        [$elem['corrida_hora']]
    );
}, []);

This is kind of "functional programming" style. If you read about array_reduce, you will see that it is used to go through array elements and reduce array to one value. There we will end up with another array, not the scalar value. We starting with empty array as initial value and if 'pais_codigo' or 'pista_nome' changed we add them to that array, else add just 'corrida_hora'.

Here is demo code.

sevavietl
  • 3,762
  • 1
  • 14
  • 21