【问题标题】:php function to split an array at each blank line?php函数在每个空行分割一个数组?
【发布时间】:2009-07-27 14:49:26
【问题描述】:

我正在构建一个脚本,它将打开一个保存的文本文件,将内容导出到一个数组,然后将内容转储到数据库中。到目前为止,我已经能够非常愉快地进行文件上传,并且还可以打开所述文件。

我遇到的问题是文件的内容是可变的,它们具有固定的结构,但内容每次都会改变。该文件的结构是每个“节”之间用空行分隔。

我已经使用 php 的 file() 来获取一个数组...我不确定是否有办法在每次遇到空行时将该数组拆分?

  $file = $target_path;
  $data = file($file) or die('Could not read file!');

示例输出:

[0] => domain.com
[1] =>  # Files to be checked
[2] =>   /www/06.php
[3] =>   /www/08.php
[4] => 
[5] => domain2.com
[6] =>  # Files to be checked
[7] =>   /cgi-bin/cache.txt
[8] =>   /cgi-bin/log.txt
[9] => 
[10] => domain3.com
[11] =>  # Files to be checked
[12] =>   /www/Content.js
[13] => 

我知道字段 0 和 1 将是常量,它们将始终是域名,然后是哈希线。之后的行数可能介于 1 到 1000 行之间。

我查看了 array_chunk() ,它与我想要的很接近,但它适用于数值,如果有一些东西适用于指定的值(比如换行符或逗号),那会有什么好处或类似的东西!)。

最后,如果之前已经回答过这个问题,我们深表歉意。我已经在通常的地方搜索了几次以寻找潜在的解决方案。

希望你能帮忙:) 狐狸精

【问题讨论】:

    标签: php arrays file multidimensional-array


    【解决方案1】:

    我认为您正在寻找的是preg_split。如果你只是在回车上拆分,你可能会错过只有空格或制表符的行。

    $output =  array(...);//what you just posted
    $string_output = implode('', $output);
    $array_with_only_populated_lines = preg_split('`\n\W+`', $string_output);
    

    【讨论】:

    • 请注意,上面发布的实际正则表达式仅适用于我在发布前玩弄的虚拟示例。如果它不适合您的目的,您可能需要对其进行一些调整。
    • 不做file()、implode()、preg_split(),可以用file_get_contents()代替。
    • 在我看来这种模式会损坏数据。
    【解决方案2】:

    你可以做这样的事情。您也可以更改它以逐行读取文件,而不是使用 file(),这将使用更少的内存,如果您使用较大的文件,这可能很重要。

    $handle = fopen('blah', 'r');
    $blocks = array();
    $currentBlock = array();
    while (!feof($handle)) {
        $line = fgets($handle);
        if (trim($line) == '') {
            if ($currentBlock) {
                $blocks[] = $currentBlock;
                $currentBlock = array();   
            }
        } else {
            $currentBlock[] = $line;
        }
    }
    fclose($handle);
    //if is anything left
    if ($currentBlock) {
        $blocks[] = $currentBlock;   
    }
    
    print_r($blocks);
    

    【讨论】:

    • 可能会解决问题,但绝对是效率最低的。 Wesley 对仅使用 file_get_contents() 提出了一个非常好的观点。
    • 您只是在考虑 CPU。如果文件是 1Gb,则 file_get_contents() 并将其转换为数组将具有更高的峰值内存使用量。我认为这也值得考虑。
    【解决方案3】:

    你试过 split('\n\n', $file); ?

    【讨论】:

    • 当然 split() 可以处理字符串,他说的是处理字符串数组。
    • 这与我发布的内容是一样的 :),但是 @Wesley 所说的
    【解决方案4】:

    您可以先在空行上拆分,然后在新行上拆分,例如:

    $file = $target_path;
    $fileData = file_get_contents($file) or die('Could not read file!');
    $parts = explode("\n\n", $data);
    $data = array();
    foreach ($parts as $part) {
        $data[] = explode("\n", $part);
    }
    

    你也可以使用 preg_split() 代替第一个 explode() 和一个正则表达式来 sp.lit 只包含空格的行(例如 \s+)

    【讨论】:

      【解决方案5】:

      我会使用函数preg_grep() 来减少结果数组:

      $array = preg_grep('/[^\s]/', $array);
      

      【讨论】:

      • 这不会提供所需的多维结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多