Mr.Web
Mr.Web

Reputation: 7144

PHP parsing a file into array

I'm trying to figure out what I'm doing that gives me the wrong result.

I have a file composed this way:

2017/05/02  BA  86  23  39  89  5
2017/05/02  CA  23  4   14  86  5
2017/05/02  FI  71  26  19  15  6
2017/05/02  GE  69  5   16  58  83
2017/05/02  MI  19  45  4   16  68
2017/05/02  NA  6   16  75  78  89
2017/05/02  PA  67  83  21  5   1
2017/05/02  RM  51  79  12  47  19
2017/05/02  RN  27  83  41  37  23
2017/05/02  TO  44  17  60  31  53
2017/05/02  VE  89  32  48  71  57
2017/05/04  BA  61  70  47  71  75
2017/05/04  CA  26  44  16  77  55
2017/05/04  FI  3   11  37  38  18
2017/05/04  GE  70  14  75  86  55
2017/05/04  MI  71  53  39  6   30
2017/05/04  NA  73  20  12  13  54
2017/05/04  PA  37  49  33  80  61
2017/05/04  RM  39  60  75  32  2
2017/05/04  RN  40  78  43  75  55
2017/05/04  TO  24  87  52  90  16
2017/05/04  VE  14  54  25  61  63
2017/05/06  BA  15  31  20  78  66
2017/05/06  CA  84  33  47  9   45
2017/05/06  FI  17  48  33  49  20
2017/05/06  GE  16  51  62  21  72
2017/05/06  MI  12  83  64  62  2
2017/05/06  NA  15  80  52  5   89
2017/05/06  PA  2   33  65  72  61
2017/05/06  RM  29  49  13  70  83
2017/05/06  RN  30  81  55  37  41

As you can see this is formatted this way:

DATE(tab)LETTERS(tab)N1(tab)N2(tab)N3(tab)N4(tab)N5(tab)

The second line has the same date, and changes LETTERS and N_.

I need to insert this file into a DB but this has to have one line for every date, like so:

 Date       |BA1|BA2|BA3|BA4|BA5|CA1|CA2|CA3|CA4|CA5|FI1|FI2|FI3|FI4|FI5|
-----------------------------------------------------------------  
2017/05/02| 86 | 23| 39| 89|5  |23 | 4 | 14|86 |5.....
-----------------------------------------------------------------  
2017/05/04|61  |70 |47 |71 |75 |26 |44 |16 |77 |55...

Why my code is not working?

public function caricaStorico(){
        $this->load->helper('file');

        $storico = read_file(base_url("storico.txt"));

        $splitter = explode("\n", $storico);
        $data_estr = "-";
        $insert = [];
        $arr_key = 0;

        echo "<pre>";

        foreach ($splitter as $key => $value) {
            $dati = explode("\t", $value);

            if(count($dati)>1) {

                $data_estr = $dati[0];

                $ruota = $dati[1];
                $n1 = $dati[2];
                $n2 = $dati[3];
                $n3 = $dati[4];
                $n4 = $dati[5];
                $n5 = $dati[6];

                switch ($ruota) {
                    case 'BA':
                        array_push($insert, ["data_estrazione" => $data_estr, "BA1" => $n1, 'BA2' => $n2, "BA3" => $n3, "BA4" => $n4, "BA5" => $n5]);
                        break;

                    case 'FI':
                        $insert[$arr_key] += ["FI1" => $n1, 'FI2' => $n2, "FI3" => $n3, "FI4" => $n4, "FI5" => $n5];
                        break;

                    case 'MI':
                        $insert[$arr_key] += ["MI1" => $n1, 'MI2' => $n2, "MI3" => $n3, "MI4" => $n4, "MI5" => $n5];
                        break;

                    case 'NA':
                        $insert[$arr_key] += ["NA1" => $n1, 'NA2' => $n2, "NA3" => $n3, "NA4" => $n4, "NA5" => $n5];
                        break;

                    case 'PA':
                        $insert[$arr_key] += ["PA1" => $n1, 'PA2' => $n2, "PA3" => $n3, "PA4" => $n4, "PA5" => $n5];
                        break;

                    case 'RM':
                        $insert[$arr_key] += ["RM1" => $n1, 'RM2' => $n2, "RM3" => $n3, "RM4" => $n4, "RM5" => $n5];
                        break;

                    case 'TO':
                        $insert[$arr_key] += ["TO1" => $n1, 'TO2' => $n2, "TO3" => $n3, "TO4" => $n4, "TO5" => $n5];
                        break;

                    case 'VE':
                        $insert[$arr_key] += ["VE1" => $n1, 'VE2' => $n2, "VE3" => $n3, "VE4" => $n4, "VE5" => $n5];
                        break;

                    case 'RN':
                        $insert[$arr_key] += ["NZ1" => $n1, 'NZ2' => $n2, "NZ3" => $n3, "NZ4" => $n4, "NZ5" => $n5];
                        break;
                }
            }
            $arr_key = $arr_key+1;  
        }

        print_r($insert);
        echo "</pre>";

    }

If I remove the $input[$arr_key] and I do $input[0] I get the right result only on the first array while the others are only containing the BA numbers, as you can see:

Array
(
    [0] => Array
        (
            [data_estrazione] => 1939/01/07
            [BA1] => 58
            [BA2] => 22
            [BA3] => 47
            [BA4] => 49
            [BA5] => 69
            [FI1] => 27
            [FI2] => 57
            [FI3] => 81
            [FI4] => 43
            [FI5] => 61
            [MI1] => 40
            [MI2] => 38
            [MI3] => 57
            [MI4] => 67
            [MI5] => 7
            [NA1] => 85
            [NA2] => 44
            [NA3] => 48
            [NA4] => 88
            [NA5] => 55
            [PA1] => 73
            [PA2] => 80
            [PA3] => 39
            [PA4] => 38
            [PA5] => 57
            [RM1] => 73
            [RM2] => 24
            [RM3] => 4
            [RM4] => 39
            [RM5] => 22
            [TO1] => 19
            [TO2] => 43
            [TO3] => 10
            [TO4] => 31
            [TO5] => 27
            [VE1] => 9
            [VE2] => 43
            [VE3] => 61
            [VE4] => 14
            [VE5] => 75
            [NZ1] => 72
            [NZ2] => 12
            [NZ3] => 42
            [NZ4] => 57
            [NZ5] => 31
        )

    [1] => Array
        (
            [data_estrazione] => 1939/01/14
            [BA1] => 18
            [BA2] => 77
            [BA3] => 33
            [BA4] => 62
            [BA5] => 19
        )

    [2] => Array
        (
            [data_estrazione] => 1939/01/21
            [BA1] => 68
            [BA2] => 65
            [BA3] => 41
            [BA4] => 28
            [BA5] => 67
        )

    [3] => Array
        (
            [data_estrazione] => 1939/01/28
            [BA1] => 76
            [BA2] => 55
            [BA3] => 48
            [BA4] => 85
            [BA5] => 71
        )

    [4] => Array
        (
            [data_estrazione] => 1939/02/04
            [BA1] => 70
            [BA2] => 2
            [BA3] => 20
            [BA4] => 85
            [BA5] => 75
        )

    [5] => Array
        (
            [data_estrazione] => 1939/02/11
            [BA1] => 82
            [BA2] => 81
            [BA3] => 16
            [BA4] => 52
            [BA5] => 77
        )

Upvotes: 0

Views: 36

Answers (1)

Sinan Ulker
Sinan Ulker

Reputation: 485

You can achive this via using date as a key of array check this out: I used string variable to demonstrate your case so you can change storico variable as you wish.

<?php
 function caricaStorico(){
        $storico = '2017/05/02  BA  86  23  39  89  5, 2017/05/02  CA  23  4   14  86  5, 2017/05/03  BA  86  23  39  89  5, 2017/05/03  CA  23  4   14  86  5';
        $splitter = explode(",", $storico);
        $data_estr = "-";
        $insert = [];

        echo "<pre>";
        foreach ($splitter as $key => $value) {
            $dati = explode("  ", $value);

            if(count($dati)>1) {

                $data_estr = trim($dati[0]);

                $ruota = $dati[1];
                $n1 = $dati[2];
                $n2 = $dati[3];
                $n3 = $dati[4];
                $n4 = $dati[5];
                $n5 = $dati[6];

                if(isset($insert[$data_estr]) && is_array($insert[$data_estr]) )
                   $insert[$data_estr] += [ "data_estrazione" => $data_estr,  $ruota."1" => $n1, $ruota."2" => $n2, $ruota."3" => $n3, $ruota."4" => $n4, $ruota."5" => $n5 ];
                else 
                    $insert[$data_estr] = array("data_estrazione" => $data_estr, $ruota."1" => $n1, $ruota."2" => $n2, $ruota."3" => $n3, $ruota."4" => $n4, $ruota."5" => $n5 );
             }
        }

        print_r($insert);
        echo "</pre>";

    }

     caricaStorico();
?>

output to this code:

 Array
(
    [2017/05/02] => Array
        (
            [data_estrazione] => 2017/05/02
            [BA1] => 86
            [BA2] => 23
            [BA3] => 39
            [BA4] => 89
            [BA5] => 5
            [CA1] => 23
            [CA2] => 4
            [CA3] =>  14
            [CA4] => 86
            [CA5] => 5
        )

    [2017/05/03] => Array
        (
            [data_estrazione] => 2017/05/03
            [BA1] => 86
            [BA2] => 23
            [BA3] => 39
            [BA4] => 89
            [BA5] => 5
            [CA1] => 23
            [CA2] => 4
            [CA3] =>  14
            [CA4] => 86
            [CA5] => 5
        )

)

Upvotes: 1

Related Questions