Ao trabalhar com pequenas quantidades de dados em PHP, às vezes é mais fácil armazená-los em arquivos do que criar um banco de dados e organizar a interação de scripts com ele. Nesses casos, a tarefa de excluir linhas especificadas de um arquivo de texto não é incomum. Vamos dar uma olhada na maneira mais simples possível de fazer isso.
Necessário
Conhecimento básico de PHP
Instruções
Passo 1
Dados iniciais:
- temos um arquivo de texto allStrings.txt, que contém várias linhas de dados
- é necessário excluir a linha nº 44 do arquivo
O algoritmo para resolver o problema será o seguinte: você precisa abrir o arquivo, ler as linhas contidas nele em um array de strings e sobrescrever o arquivo existente com o conteúdo do array, pulando a linha a ser deletada.
Passo 2
Para implementar esse algoritmo no script, primeiro atribuímos valores às variáveis que conterão o nome do arquivo de origem e o número da linha a ser excluída: $ fileName = "allStrings.txt";
$ lineToKill = 44; Em seguida, vamos ler o arquivo em um array de strings: $ stringsArray = file ($ fileName); Vamos verificar se o arquivo contém a linha que precisamos. Todo o código adicional será executado apenas se a condição $ lineToKill não for maior que o número de linhas no array $ stringsArray: if ($ lineToKill <= count ($ stringsArray)) {
// este será o loop principal do programa
} Se a condição não for atendida, não temos nada a excluir. Deixe o script imprimir uma mensagem informativa sobre isso: else echo "O número de linhas no arquivo é menor que". $ LineToKill. "!"; Se a condição for atendida, você deve limpar o arquivo de origem para uma nova entrada: $ fileHandle = fopen ($ fileName, "w"); Agora devemos organizar um loop que itera sobre todos os elementos do array string. Mas, como a indexação da matriz começa do zero e contamos o número da linha para exclusão de um, então, mesmo antes do início do loop, diminuiremos o valor de $ lineToKill em um, de modo a não repetir esta operação a cada etapa: $ lineToKill -; Para organizar um loop: foreach ($ stringsArray as $ key => $ value) {
// aqui está o código de cada etapa do loop
} A variável $ key conterá o índice da linha atual no array, e a variável $ value conterá o valor desta linha. Em cada etapa do loop, compararemos o índice da linha no array com o número a ser excluído e, se eles não corresponderem, escreveremos o valor desta linha no arquivo: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); À se eles corresponderem, então não gravaremos no arquivo, mas imprimiremos uma mensagem sobre a exclusão bem-sucedida: else echo "Line". $ LineToKill. "Deleted."; E no final do ciclo, quando a gravação do arquivo for concluída, você deve fechá-lo educadamente: fclose ($ fileHandle);
etapa 3
O código completo ficará assim: <? Php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ stringsArray = arquivo ($ fileName);
if ($ lineToKill <= count ($ stringsArray)) {
$ fileHandle = fopen ($ fileName, "w");
$ lineToKill--;
foreach ($ stringsArray as $ key => $ value) {
if ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);
else echo "Line". $ lineToKill. "deletada.";
}
fclose ($ fileHandle);
}?> Claro, este é o código mais simples, no qual não há proteção contra todas as complicações que podem ocorrer durante o trabalho do script em condições reais. Por exemplo, se um arquivo contém um grande número de linhas, a leitura deles em um array eliminará um pedaço que é inadmissivelmente grande para um script dos recursos do servidor. Obviamente, o trabalho com grandes quantidades de dados deve ser organizado por meio de bancos de dados, não de arquivos de texto. Ainda assim, como exemplo educacional, daremos um código que também resolve esse problema. Aqui, o algoritmo será diferente do anterior: para não armazenar um grande número de linhas no array, o script lerá do arquivo de origem uma linha de cada vez e as gravará uma a uma no arquivo temporário. Ao final desse processo, o arquivo original será excluído e o arquivo temporário será movido para o seu lugar.
Passo 4
Este script começará da mesma maneira que o anterior:
$ fileName = "allStrings.txt";
$ lineToKill = 44;
Então você precisa criar um arquivo temporário para funcionar. Vamos fazer isso na pasta "tmp" e dar o mesmo prefixo ao arquivo temporário: $ tempFile = tempnam ("/ tmp", "tmp"); Agora vamos tentar abrir o arquivo fonte para leitura: if ($ fileHandle = @fopen ($ fileName, "rb")) {
// este código será executado no caso de abertura normal do arquivo fonte
} Se falhar - o trabalho posterior do script não faz sentido, encerramos o processo com a emissão da mensagem correspondente: else die ("O arquivo fonte não existe!"); Se o arquivo foi aberto normalmente, então nós irá imprimir uma notificação sobre isso e tentar abrir o arquivo temporário criado anteriormente com uma mensagem correspondente: echo "Arquivo fonte existe";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "Um arquivo temporário foi criado."; Agora é hora de iniciar um ciclo de leitura de linhas do arquivo de origem, que continuará até atingir o final de o arquivo: while (! feof ($ fileHandle)) {
// aqui estará o código para trabalhar com a linha atual
} Em cada etapa do loop, leremos uma linha: $ lineToWrite = fgets ($ fileHandle); E se esta não for a linha a ser excluída, então grave-a em um arquivo temporário. O contador de linha $ lineNum será incrementado diretamente na operação de comparação: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Quando as linhas acabarem, feche o arquivo: fclose ($ fileHandle);
fclose ($ tempHandle); Finalmente, renomeie o arquivo temporário para o original. Se esta operação for bem-sucedida, então emitiremos uma mensagem correspondente: if (rename ($ tempFile, $ fileName)) echo "A linha $ lineToKill foi deletada";
Etapa 5
Código completo:
<? php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");
if ($ fileHandle = @fopen ($ fileName, "rb")) {
echo "Arquivo fonte existe";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "Arquivo temporário foi criado.";
}
else die ("O arquivo fonte não existe!"); while (! feof ($ fileHandle)) {
$ lineToWrite = fgets ($ fileHandle);
if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);
} fclose ($ fileHandle);
fclose ($ tempHandle);
if (rename ($ tempFile, $ fileName)) echo "Linha $ lineToKill removida";?>