How do I make a logical condition comparing lines of a text file, using fopen in php?

1

I have the code below where it opens the file material1.txt , reads to the end and I need to do a comparison of one line with another for example:

$material = fopen("c:/inetpub/wwwroot/material1.txt","r");

while(!feof($material)){
    $linha = fgets($material,4096);

    echo $linha;
}

fclose($material);

In the file I have rows that fields are delimited by "|"

Example:

 material | nivel | quantidade | tipo    |
 lápis    |   1   |      20    | escolar |
 mochila  |   2   |      2     | escolar |

The comparison would be at the level if the value of the next line is > that the previous level is child if the next line the value e < it is parent of another level if value is equal is the same level.

I would like to make another column where the child level will receive the material column of the parent level for example:

| material_pai | material | level | quantity | | pencil | pencil | 1 | 20 | | pencil | backpack | 2 | 2 | | pencil | notebook | 2 | 5 | | case | case | 1 | 3 | | case | rubber | 2 | 10 | | rubber | pen | 3 | 20 | | case | brush | 2 | 10 |

    
asked by anonymous 26.04.2016 / 17:50

1 answer

0

In general, your question is confusing, compare and play where, there is a logical hole, when I get to the last line I compare with who ?, was not it easier to group all the levels and then compare?

Anyway, I think for your case, it's best to use PHP's file function, because it will treat your file as a large array, each line being one position, so you would be able to scroll back and forth. A simple example that I can give you is the one below, as I said it's strange this logic of yours.

Example # 1 (try to follow your logic)

<?php
// Abre o arquivo e trasforma cada linha uma posição de uma matriz
$materiais = file("material1.txt");

// Percore todas as linhas do arquivo (ignorando a primeira linha)
// E agrupa todo mundo nos respectivos niveis
$grupos = array();  // Variavel vazia para montar os niveis
for ($l = 1; $l < count($materiais); $l++) {
 list($material, $nivel, $quantidade, $tipo) = explode("|", $materiais[$l]);

 // FIX: Verifica se existe proxima linha
 if (isset($materiais[($l + 1)])) {
  list($material2, $nivel2, $quantidade2, $tipo2) = explode("|", $materiais[($l + 1)]); // Lê a próxima linha

  if ($nivel2 > $nivel) {
   echo "[" . $material2 . "] é filho de [" . $material . "]\r\n";
  } else if ($nivel2 < $nivel) {
   echo "[" . $material2 . "] é pai [" . $material . "]\r\n";     
  } else {
   echo "[" . $material2 . "] é mesmo nivel de [" . $material . "]\r\n";
  }

  $l++; // Adianta uma linha já que li duas num laço apenas 
 } else {
  echo "[" . $material . "] não tem próxima comparação\r\n";
 }   
}
?>


To correct this hole as I said I would join everyone in groups of levels type all level 1,2,3 and etc. in arrays, and then just filter from a level up to the maximum level, for example if it goes up to 5 I could ask for 3 to 5. Getting more or less so the code.

Example # 2 (by my logic)

<?php
// Abre o arquivo e trasforma cada linha uma posição de uma matriz
$materiais = file("material1.txt");

// Percore todas as linhas do arquivo (ignorando a primeira linha)
// E agrupa todo mundo nos respectivos niveis
$grupos = array();  // Variavel vazia para montar os niveis
for ($l = 1; $l < count($materiais); $l++) {
 list($material, $nivel, $quantidade, $tipo) = explode("|", $materiais[$l]); 
 $grupos[$nivel][] = array($material, $nivel, $quantidade, $tipo); 
}

// --------------------------------------------------------------
$nivel_inicio = 2; // Nivel minino a mostar (no exemplo 2)

// Inicia a filtragem atarves do nivel
$novo_grupo = array(); 
foreach ($grupos as $nivel => $valores) {
 if ($nivel_inicio <= $nivel) {
  $novo_grupo[$nivel][] = $valores;
 }
}

print_r($novo_grupo);
?>
    
27.04.2016 / 00:04