Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: shamaka en 25 Junio 2018, 04:14 am



Título: Agregar datos por linea a un archivo
Publicado por: shamaka en 25 Junio 2018, 04:14 am
Hola! Tengo este fragmento de código que hace parte del trabajo.

Código
  1. $txt = fopen("archivo.php","a+");
  2. fwrite($txt, "valor1" .chr(10));

y queda algo como:

Código
  1. valor1
  2. valor2
  3. ...

Lo que quiero hacer es que haga eso mismo, pero despues de unas cuantas lineas. Por ejemplo, en ese archivo esta:

Código
  1. <?php
  2. $var = 1;
  3. $vard = 2;
  4.  
  5. //Aqui quiero empezar a insertar los valores
  6. echo "
  7. [b]valor1
  8. valor2[/b]
  9. ";
  10. ?>

Como ven, lo que quiero lograr es que se vallan agregando las lineas, despues de:

Código
  1. <?php
  2. $var = 1;
  3. $vard = 2;

Y antes de:

Código
  1. ";
  2. ?>

Espero que me puedan ayudar! Saludos


Título: Re: Agregar datos por linea a un archivo
Publicado por: shamaka en 25 Junio 2018, 04:30 am
Veo que si agrego las lineas al principio no hay problema, va llenando donde lo deje en blanco. Pero no encuentro la forma de hacerlo entre las lineas de abajo.


Título: Re: Agregar datos por linea a un archivo
Publicado por: #!drvy en 26 Junio 2018, 01:46 am
Estas en un problema al que todo el mundo se enfrenta tarde o temprano, todo el mundo se come la cabeza con el y al final acaban optando por soluciones más eficientes como guardar los datos en un lado externo.

Dicho esto, hay algunos modos que puedes encontrar por ahí para hacer estas cosas de forma básica e ineficiente. Ten en cuenta que en general, cuando vas a procesar e modificar un fichero, no lo estas visualizando si no que lo estas leyendo, lees los bytes buscas donde modificar e insertas lo cual equivale a sobre-escribir el fichero entero con los consecuentes aumentos de memoria.

Lo más fácil, seria coger el fichero, leerlo, determinar de cuantas lineas se compone, buscar la linea especifica en la que queremos insertar contenido, separar el contenido en dos (la primera parte antes de la linea y la segunda parte justo después), guardar la segunda mitad en memoria, añadir el nuevo contenido al final y añadir la segunda mitad que guardamos justo después.

Algo así:

Código
  1. <?php
  2.  
  3. $archivo   = 'test.php';
  4. $linea     = 7;
  5. $contenido = "Hola\n¿Que Tal?\nEstoy insertando contenido!";
  6. $nuevaLinea = "\n"; // Deberiamos determinar las lineas nuevas o usar PHP_EOL;
  7.  
  8. // Abrimos el fichero en modo lectura, leemos todo su contenido y cerramos.
  9. $file = fopen($archivo, 'r');
  10. $content = fread($file, filesize($archivo));
  11. fclose($file);
  12.  
  13.  
  14. // Separamos todo en un array siendo cada elemento de este, una linea.
  15. $contentSplit = explode($nuevaLinea, $content);
  16.  
  17. // Separamos el contenido en dos arrays justo donde deberiamos insertar el
  18. // nuevo contenido. Luego añadimos al final de la primera mitad el contenido
  19. // nuevo.
  20. $firstHalf  = array_slice($contentSplit, 0, $linea);
  21. $secondHalf = array_slice($contentSplit, $linea);
  22. $firstHalf[] = $contenido;
  23.  
  24. // Combinamos ambas mitades de nuevo.
  25. $finalContent = array_merge($firstHalf, $secondHalf);
  26.  
  27. // Unimos todo el contenido reproduciendo los saltos de linea
  28. $finalContent = implode($nuevaLinea, $finalContent);
  29.  
  30. // Sobreescribimos el fichero.
  31. $file = fopen($archivo, 'w+');
  32. fwrite($file, $finalContent);
  33. fclose($file);


De nuevo, esto no es optimo, no es eficiente e incluso se puede reestructurar de una forma mucho mejor (véase esta respuesta de StackOverflow (https://stackoverflow.com/a/3278032)), pero es para que veas los problemas a los que te enfrentas.

Saludos


Título: Re: Agregar datos por linea a un archivo
Publicado por: shamaka en 26 Junio 2018, 15:25 pm
Esta solución la había pensado, pero la cantidad de memoria que exige lo hace ineficiente, como ya lo comentas. Igual agradezco tu solucion, seria seguir buscando.