PHP: Txt for Array relating the lines.

1

Next, I have a text file (.txt) with the following structure:

|100|Nome do Cliente|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|

In short, whenever the line starts with | 100 |, all | 200 | which follow below are related to | 100 | above. Using EXPLODE in PHP, I have the following Array:

Array(
     [0] => 
     [1] => 100
     [2] => Nome do Cliente
)
...

That is, an array for each line. I would like to relate, in the array itself, the products to the client, in a structure where the products are in the same array as the Client, something like:

Array(
     [0] => 
     [1] => 100
     [2] => Nome do Cliente
     Array(
          [0] =>  
          [1] => Produto 1
          [2]=>R$100
     )
     Array(
          [0] => 
          [1] => Produto 2
          [2] => R$200
     )
     ... etc
)

Can anyone give me a light on how to relate this?

    
asked by anonymous 09.03.2016 / 19:36

2 answers

0

I would do it this way, with fopen and feof to help save memory and with trim to clear line breaks:

<?php
function tratarDados($linha) {
    //Remove espaços do começo e fim nos nomes, valores e etc
    return array_map('trim', explode('|', $linha));
}

$handle = fopen('arquivo.txt', "r");

$vetor = array();
$i = -1;

while (feof($handle) === false) {
    $line = fgets($handle);
    $line = trim($line); //Remove espaços e \r
    $line = trim($line, '|'); //Remove | do começo e do fim

    //Quando encontra o 100 adiciona um novo elemento
    if (strpos ($line, '100|') === 0) {
         $vetor[] = tratarDados($line);
         ++$i;
    } elseif ($i > -1) {
         //Se já existe um cliente no vetor adiciona os produtos pra ele
         $vetor[$i][] = tratarDados($line);
    }
}

fclose($handle);

print_r($vetor);

The .txt file looks like this:

|100|João|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|
|100|Jose|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|
|100|Marcos|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|
|100|Paulo|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|

Result:

Array
(
    [0] => Array
        (
            [0] => 100
            [1] => João
            [2] => Array
                (
                    [0] => 200
                    [1] => Produto 1
                    [2] => R$100
                )

            [3] => Array
                (
                    [0] => 200
                    [1] => Produto 2
                    [2] => R$200
                )

            [4] => Array
                (
                    [0] => 200
                    [1] => Produto 3
                    [2] => R$300
                )

        )

    [1] => Array
        (
            [0] => 100
            [1] => Jose
            [2] => Array
                (
                    [0] => 200
                    [1] => Produto 1
                    [2] => R$100
                )

            [3] => Array
                (
                    [0] => 200
                    [1] => Produto 2
                    [2] => R$200
                )

            [4] => Array
                (
                    [0] => 200
                    [1] => Produto 3
                    [2] => R$300
                )

        )

    [2] => Array
        (
            [0] => 100
            [1] => Marcos
            [2] => Array
                (
                    [0] => 200
                    [1] => Produto 1
                    [2] => R$100
                )

            [3] => Array
                (
                    [0] => 200
                    [1] => Produto 2
                    [2] => R$200
                )

            [4] => Array
                (
                    [0] => 200
                    [1] => Produto 3
                    [2] => R$300
                )

        )

    [3] => Array
        (
            [0] => 100
            [1] => Paulo
            [2] => Array
                (
                    [0] => 200
                    [1] => Produto 1
                    [2] => R$100
                )

            [3] => Array
                (
                    [0] => 200
                    [1] => Produto 2
                    [2] => R$200
                )

            [4] => Array
                (
                    [0] => 200
                    [1] => Produto 3
                    [2] => R$300
                )
        )
)
    
09.03.2016 / 22:09
0

So you can not exactly do it your way because one array group must be inside another, so the easiest is to associate a new position and group that sub-array inside. I do not know if it's clear here's the sample code.

<?php
// Massa de dados de exemplo
$txt = "|100|Nome do Cliente|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|
|100|Nome do Cliente 2|
|200|Produto 1|R$100|
|200|Produto 2|R$200|
|200|Produto 3|R$300|";

$array_final = array(); // Inicia uma Matriz vazia
$temp_cliente = 0; // Variável de controle de posição dos clientes

// Quebra as linhas da sua fonte (no caso minha variável simples)
// No seu vem a leitura do TXT aqui nessa parte
$divide_linhas = explode("\n", $txt);

// Percorre todas as linhas
for ($l = 0; $l < count($divide_linhas); $l++) {
 list($a0, $a1, $a2, $a3) = explode("|", $divide_linhas[$l]);

 if ($a1 == "100") {
  if ($l > 0) { $temp_cliente++; } // Ajuste para primeira linha apenas  

  // Monta a primeira estrutura da Matriz do cliente
  $array_final[$temp_cliente] = array($a1, $a2, array());
 } else {
  // Monta a sub-matriz dentro da primeira   
  $array_final[$temp_cliente][2][] = array($a1, $a2, $a3);
 }
}

// Imprime o resultado
print_r($array_final);
?>

The end result will look something like this (below) , then you just call the client and then go to position 2 and that will be all the products of that particular client.

Array
(
    [0] => Array
        (
            [0] => 100
            [1] => Nome do Cliente
            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => 200
                            [1] => Produto 1
                            [2] => R$100
                        )

                    [1] => Array
                        (
                            [0] => 200
                            [1] => Produto 2
                            [2] => R$200
                        )

                    [2] => Array
                        (
                            [0] => 200
                            [1] => Produto 3
                            [2] => R$300
                        )

                )

        )

)
    
09.03.2016 / 21:43