Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将PHP脚本更改为打印数组中每2000行的文件_Php_Json_Foreach - Fatal编程技术网

将PHP脚本更改为打印数组中每2000行的文件

将PHP脚本更改为打印数组中每2000行的文件,php,json,foreach,Php,Json,Foreach,我需要一些帮助,让它以我不想的方式工作 我正在尝试将easylist.txt转换为特定的Json格式,并导入到我的Untangle Firewall中 下面是我正在运行以转换它的PHP脚本。 问题是,在导入过程中限制了大约2000行。 所以我需要它为每2000行创建一个导出文件。并根据需要创建尽可能多的文件 这件事上的任何帮助都将被假定 谢谢网络傻瓜 <?php $Content = "./easylist.txt"; $lines = file($Content); $vJsonFi

我需要一些帮助,让它以我不想的方式工作

我正在尝试将easylist.txt转换为特定的Json格式,并导入到我的Untangle Firewall中

下面是我正在运行以转换它的PHP脚本。 问题是,在导入过程中限制了大约2000行。 所以我需要它为每2000行创建一个导出文件。并根据需要创建尽可能多的文件

这件事上的任何帮助都将被假定

谢谢网络傻瓜

<?php
$Content = "./easylist.txt"; 
$lines = file($Content); 
$vJsonFileName = "AD-Blocker". ".json"; 
$badcharacters = array("#",'"', "'", "[", "]", "\n", "\t"); 
header("Content-type: application/json"); 
header("Content-Disposition: attachment; filename=$vJsonFileName");
header('Cache-Control: public');
echo "["; 
foreach($lines as $str){ 
$cleanstr = str_replace($badcharacters, "", $str);
echo '{"enabled":true,"string":"'.$cleanstr.'","javaClass":"com.untangle.uvm.node.GenericRule"},'; 
}
echo "]"; 
?>

假设您可以任意分割输入数据(即条目不跨越多行,且每行都是“原子的”),那么您可以提取所需的行数

$Content = "./easylist.txt"; 
$lines = file($Content); 
$linesSplit = array_chunk( $lines, 2000 );

顺便问一下,你真的需要删除“坏字符”?您是否使用进行了调查?

您无法下载多个文件,因此下面将创建多个文件。 这里有一篇关于压缩文件的帖子:



为什么不试试
for
循环而不是
foreach
?我不明白你的问题。为什么不在循环中放置一个计数器,用于将行存储在数组中,当达到2000时,将它们写入文件并清空数组。如果这不是你想要的,请提供更多的细节。几年前我就开始使用PHP或编程,所以我有点“生疏”。这两种方法听起来都是可行的。我们将对此进行测试,然后再与您联系。谢谢至于需要删除的坏字符,请修改导入脚本。但可能是我删除了一些不需要删除的额外内容。啊,看看这些变化,我想我想念你在第一篇文章中的领导。我需要将第一个2000行输入到Exportfile1.json中,然后将2000行输入到ExportFile2.json中,依此类推,最后一个文件应该打印出剩下的所有行。@liquarvicar,感谢您的反馈。。你的帮助是推动我前进的动力,但我有一个问题,让它“导出”多个文件,所以我将不得不看看它。再次感谢。@WebFooL您能不能循环遍历生成的数组并将每个数组保存到一个单独的文件中?您的脚本似乎正在向浏览器输出文件?这不适用于多个文件。如果您需要以这种方式输出它们,请参阅Andy Gee的答案。感谢您,我必须查看是否应该将它们全部写入一个文件,但只是单独的行,或者必须对zip文件执行一些操作。扩展性不好-您将文件的全部内容存储在内存中两次,外加开销。最好是逐行处理文件(
fopen()
+
fgets()
)Kaii-无可否认,它的可伸缩性不强。我不认为这是个问题,因为这只是为了导入防火墙规则,不太可能被很多人同时使用。如果文件太大或内存有问题,
fopen()
+
fgets()
将是一个更好的解决方案。再说一次,我不想用那么多规则堵塞我的防火墙。
<?php
$Content = "./easylist.txt"; 
$lines = file($Content); 
$vJsonFileName = "AD-Blocker.zip"; 
$badcharacters = array("#",'"', "'", "[", "]", "\n", "\t"); 
$f = 1;
foreach($lines as $str)
{
    $c++;
    if($c==2000)
    {
        $f++;
    }
    $cleanstr = str_replace($badcharacters, "", $str);
    $json[$f] = '{"enabled":true,"string":"'.$cleanstr.'","javaClass":"com.untangle.uvm.node.GenericRule"},'; 
}

foreach($json as $f => $arr)
{
    file_put_contents('file'.$f,'['.implode('',$arr).']');
}


//zip up all the files here to $vJsonFileName


header("Content-type: application/json"); 
header("Content-Disposition: attachment; filename=$vJsonFileName");
header('Cache-Control: public');
?>