爆炸性txt文件 PHP

3

我在 PHP 中遇到了一个问题,无法将 txt 文件进行分割。下面是我的问题示例:

Product N°3456788765
price: 0.09
name: carambar


Product N°3456789
price: 9
name: bread

所以基本上,我想要一个像这样的数组:
array
    [0] => 
           [0] => Product N°3456788765
           [1] => price: 0.09
           [2] => name: carambar
    [] => 
           [0] => Product N°3456789
           [1] => price: 9
           [2] => name: bread

在其他的问题中,他们使用了explode函数。不幸的是,我不知道如何告诉这个函数分隔符是空行... 我尝试进行了一些研究,因为当我对一个空行使用strlen()函数时,它显示出2个字符。所以在使用ord()函数后,我发现这两个字符在Ascii模式下是13和10,但如果我尝试使用...
$string = chr(13) . chr(10);
strcmp($string,$blankline); 

它就是不起作用。我本来想在我的分隔符中使用这个$string...

谢谢大家的建议,在多年寻找答案后,这是我第一次在这里发帖 :)

3个回答

4

尝试类似以下代码:

$file   =   file_get_contents("text.txt");
// This explodes on new line
// As suggested by @Dagon, use of the constant PHP_EOL
// is a better option than \n for it's universality
$value  =   explode(PHP_EOL,$file);
// filter empty values
$array  =   array_filter($value);
// This splits the array into chunks of 3 key/value pairs
$array  =   array_chunk($array,3);

给您带来以下好处:
Array
(
    [0] => Array
        (
            [0] => Product N°3456788765
            [1] => price: 0.09
            [2] => name: carambar
        )

    [1] => Array
        (
            [0] => Product N°3456789
            [1] => price: 9
            [2] => name: bread
        )

)

第一个解决方案不起作用,explode()函数期望接收一个字符串参数和一个可选的第二个参数。$file是一个字符串数组,每一行都是数组的一行...第二个解决方案无法工作,因为我并不总是有相同数量的行... - Hammerbot
对不起,这取决于PHP版本。在我的版本中没有出现过这个错误。你必须先分别执行explode操作,才不会出现这个错误。 - Rasclatt
那么你的意思是并不总是有三个一组,对吗? - Rasclatt
哦,我以为你在使用类似 $file = file_get_contents("text.txt"); 的东西。 - Rasclatt
另外,还有一种选择是使用fopen()feof()fgets()对文件进行逐行读取,正如@Dagon所建议的那样,可以使用常量PHP_EOL(行尾符)代替换行符\n。根据PHP手册中的说明,这个常量是该平台上正确的行尾符号。话虽如此,使用file()函数已经将每一行放入一个数组中,所以你基本上可以跳过这个过程的那部分... - Rasclatt
显示剩余7条评论

2
不要复杂化,只需使用与file()结合的array_chunk()
<?php

    $lines = file("yourTextFile.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
    $chunked = array_chunk($lines, 3);
    print_r($chunked);

?>

我并不经常需要从文件逐行读取的能力,但我不知道在该函数中FILE_SKIP_EMPTY_LINES是一个选项...这很好知道。 - Rasclatt
@Rasclatt 是的,还有另一个标志,如果您想忽略每行末尾的换行符。(我个人经常使用file()) - Rizier123
1
好的,无论如何,你的答案是三个中最好的!干杯。 - Rasclatt
我认为你的解决方案存在问题,因为行数可能会根据产品而变化。 - Hammerbot
@El_Matella 如果是这种情况,你可以直接移除过滤器,然后检查第一个空行的位置,然后将数组分块并移除空行。 - Rizier123

0

结果在这里:

    $text = file_get_contents('file.txt');
    $temp = explode(chr(13) . chr(10) . chr(13) . chr(10),$text);
    $hands = array();
    foreach($temp as $hand){
        $hand = explode(chr(13) . chr(10),$hand);
        $hand = array_filter($hand);
        array_push($hands,$hand);
        $hand = array_filter($hand);
    }
    dd($hands);

当产品更改时,我有两个chr(13) . chr(10),并且只更改行时有一个。所以现在它有效了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接