PHP: Txt for Array relating lines.

Asked

Viewed 673 times

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| 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 customer, in a structure where the products are in the same array as the Customer, 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 someone give me a light on how to relate this?

  • All customers start with 100 and all products with 200?

2 answers

0

So you can’t do it exactly that way because one matrix group must be inside another, so the easiest thing is to associate a new position and group that sub-matrix inside. I don’t know if it’s clear here’s the example 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 come out something like this (down below), there will be enough you call the customer and then go through the position 2 and this will be all the products of that particular customer.

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
                        )

                )

        )

)
  • Our thanks, both worked magnificently.

0


I would do it this way, with the fopen and feof to help save memory and with trim to clean 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 looked 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|

Upshot:

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
                )
        )
)
  • 1

    Like the above, both worked magnificently. But yours, for me, had a better use due to the loop of countless files I have in a folder, to handle everything one by one, yours is more usual. Thank you all

  • @Marcio the script was generating an extra dimension, I fixed it

  • @Guilhermenasdcimento, I kind of made a mess yesterday when I saw other files that I need to transfer to database, where there are several levels of relationship. I tried to edit the question here but there was a message that I couldn’t edit. Above the Customer and products, there is also the company responsible for the sale. If you can, please see here . Thanks so much for your help.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.