【问题标题】:How to combine all strings from mutiple txt files and sort them in one array in PHP?如何组合来自多个文本文件的所有字符串并在 PHP 中将它们排序到一个数组中?
【发布时间】:2017-04-29 18:29:05
【问题描述】:

我尝试合并三个 txt 文件,一旦它们全部解析,我必须将它们全部分类为三个不同的输出。到目前为止,我已经能够解析所有文件并为它们使用三个不同的 foreach 语句。对于文件中的每一行,我必须为每个字符串用不同的属性标记它们。我的目标是将它们全部放入一个数组中并对其进行排序。到目前为止,这是我的代码:

空格.txt

last_name first_name middle_initial gender dob fav_color
Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-1973 Black

逗号.txt

last_name, first_name, gender, dob, fav_color
Abercrombie, Neil, Male, Tan, 2/13/1943
Bishop, Timothy, Male, Yellow, 4/23/1967
Kelly, Sue, Female, Pink, 7/12/1959

管道.txt

last_name | first_name  | middle_initial | gender | dob | fav_color
Smith | Steve | D | M | Red | 3-3-1985
Bonk | Radek | S | M | Green | 6-3-1975
Bouillon | Francis | G | M | Blue | 6-3-1975

数据.php

<?php 

    $space_txt = './data/input/space.txt';
    $comma_txt = './data/input/comma.txt';
    $pipe_txt = './data/input/pipe.txt';

    $parsed_space_data = file_get_contents($space_txt);
    $parsed_comma_data = file_get_contents($comma_txt);
    $parsed_pipe_data = file_get_contents($pipe_txt);

    $spaces = explode("\r", $parsed_space_data);
    $commas = explode("\r", $parsed_comma_data);
    $pipes = explode("\r", $parsed_pipe_data);




    foreach ($spaces as $space => $data) {
        $space_data = explode(' ' , $data);

        $info[$space]['last_name'] = $space_data[0];
        $info[$space]["first_name"] = $space_data[1];
        $info[$space]["middle_initial"] = $space_data[2];
        $info[$space]["gender"] = $space_data[3];
        $info[$space]["date_of_birth"] = $space_data[4];
        $info[$space]["favorite_color"] = $space_data[5];


        $s_array = implode(' ' , array($info[$space]['last_name'], $info[$space]["first_name"], $info[$space]["gender"], $info[$space]["date_of_birth"], $info[$space]["favorite_color"]));


        $space_old_data = array("F", "-");
        $space_new_data = array("Female", "/");

        $space_array = str_replace($space_old_data, $space_new_data, $s_array);





        echo $space_array . '<br><br>';


    }

    foreach ($commas as $comma => $data) {
        $comma_data = explode(',', $data);

        $info[$comma]["last_name"] = $comma_data[0];
        $info[$comma]["first_name"] = $comma_data[1];
        $info[$comma]["gender"] = $comma_data[2];
        $info[$comma]["favorite_color"] = $comma_data[3];
        $info[$comma]["date_of_birth"] = $comma_data[4];

        $comma_array = implode(' ' , array($info[$comma]['last_name'], $info[$comma]["first_name"],  $info[$pipe]["middle_initial"],$info[$comma]["gender"], $info[$comma]["date_of_birth"], $info[$comma]["favorite_color"]));


         echo $comma_array  . '<br><br>';


    }

    foreach ($pipes as $pipe => $data) {
        $pipe_data = explode(' |', $data);

        $info[$pipe]["last_name"] = $pipe_data[0];
        $info[$pipe]["first_name"] = $pipe_data[1];
        $info[$pipe]["middle_initial"] = $pipe_data[2];
        $info[$pipe]["gender"] = $pipe_data[3];
        $info[$pipe]["favorite_color"] = $pipe_data[4];
        $info[$pipe]["date_of_birth"] = $pipe_data[5];




        $p_array = implode(' ' , array($info[$pipe]['last_name'], $info[$pipe]["first_name"], $info[$pipe]["middle_initial"], $info[$pipe]["gender"], $info[$pipe]["favorite_color"], $info[$pipe]["date_of_birth"]));


        $pipe_old_data = array("M", "-");
        $pipe_new_data = array("Male", "/");

        $pipe_array = str_replace($pipe_old_data, $pipe_new_data, $p_array);





        echo $pipe_array . '<br><br>';





}









 ?>

以下输出应该是:

输出 1

Hingis Martina Female 4/2/1979 Green
Kelly Sue Female 7/12/1959 Pink
Kournikova Anna Female 6/3/1975 Red
Seles Monica Female 12/2/1973 Black
Abercrombie Neil Male 2/13/1943 Tan
Bishop Timothy Male 4/23/1967 Yellow
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Smith Steve Male 3/3/1985 Red

输出 2

Abercrombie Neil Male 2/13/1943 Tan
Kelly Sue Female 7/12/1959 Pink
Bishop Timothy Male 4/23/1967 Yellow
Seles Monica Female 12/2/1973 Black
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Kournikova Anna Female 6/3/1975 Red
Hingis Martina Female 4/2/1979 Green
Smith Steve Male 3/3/1985 Red

输出3

Smith Steve Male 3/3/1985 Red
Seles Monica Female 12/2/1973 Black
Kournikova Anna Female 6/3/1975 Red
Kelly Sue Female 7/12/1959 Pink
Hingis Martina Female 4/2/1979 Green
Bouillon Francis Male 6/3/1975 Blue
Bonk Radek Male 6/3/1975 Green
Bishop Timothy Male 4/23/1967 Yellow
Abercrombie Neil Male 2/13/1943 Tan

在每个 foreach 语句之外,当我打印一个数组时,它只打印每个文件的最后一行。我可以做些什么来简化代码以实现我的目标?

【问题讨论】:

  • 这里 $comma_array = implode() 应该是这样 $comma_array[]
  • 只是为了澄清您的术语,您正在使用implode,它将数组转换为字符串。因此,您在 foreach 中输出一个字符串。如果要创建一个大字符串,可以使用 .= 运算符连接每一行。例如。 $pipe_output .= $pipe_array . '&lt;br&gt;&lt;br&gt;'; 然后$pipe_output 将可用于循环外的所有行
  • 但是每个字符串都必须设置一个特定的属性
  • 在这种情况下,最好使用双方括号方法将每一行放入一个数组中

标签: php arrays sorting parsing


【解决方案1】:

我把它全部放在一个循环中,但你也可以为它创建一个函数,而不是使用多个ifs

//$space_txt = './data/input/space.txt';
//$comma_txt = './data/input/comma.txt';
//$pipe_txt = './data/input/pipe.txt';

//$parsed_space_data = file_get_contents($space_txt);
//$parsed_comma_data = file_get_contents($comma_txt);
//$parsed_pipe_data = file_get_contents($pipe_txt);


$spaceArray  = myExpldeLoopFunc("space"," ",$parsed_space_data);
$commaArray  = myExpldeLoopFunc("comma",",",$parsed_comma_data);
$pipeArray   = myExpldeLoopFunc("pipe","|",$parsed_pipe_data);

$finalArray = array_merge($spaceArray,$commaArray,$pipeArray);


function myExpldeLoopFunc($name, $sep, $data){

   $parsedData = explode("\r", $data);

   $arr = [];
   foreach($parsedData as $data):
      $dataArr = explode($sep, $data);

      if($name == 'space'):
           $arr[] = [
            "last_name"      => $dataArr[0],
            "first_name"     => $dataArr[1],
            "middle_initial" => $dataArr[2],
            "gender"         => $dataArr[3],
            "date_of_birth"  => $dataArr[4],
            "favorite_color" => $dataArr[5]
          ];
      elseif($name == 'comma'):
          $arr[] = [
            "last_name"      => $dataArr[0],
            "first_name"     => $dataArr[1],
            "gender"         => $dataArr[2],
            "favorite_color" => $dataArr[3],
            "date_of_birth"  => $dataArr[4]
          ];
      else:
          $arr[] = [
            "last_name"      => $dataArr[0],
            "first_name"     => $dataArr[1],
            "middle_initial" => $dataArr[2],
            "gender"         => $dataArr[3],
            "favorite_color" => $dataArr[4],
            "date_of_birth"  => $dataArr[5]
        ];
    endif;

   endforeach;

   return $arr;
}

【讨论】:

  • 这看起来是一个很好的解决方案,但我必须能够根据你给我的语法解析我的文件和输出数据。
  • 添加了每个文本爆炸的功能。
  • 我在“pipes”中的“date_of_birth”=> $dataArr[5] 上得到一个未定义的偏移量 5 错误,当我执行 elseif ($name = 'pipes){} 时,即使我没有任何显示've echoed $arr;
  • 我也做了 var_dump($finalArray);它只打印每个文件的最后一行
  • 你能检查每个文件$parsed_space_data = file_get_contents($space_txt); $parsedData = explode("\r",$parsed_space_data); 看看你是否从换行符中得到一个数组?
【解决方案2】:

您需要创建数组的多维数组。而不是

$space_array = str_replace($space_old_data, $space_new_data, $s_array);

使用

$space_array[] = str_replace($space_old_data, $space_new_data, $s_array);

然后在foreach之外使用print_r转储所有数据

print_r($space_array)

【讨论】:

  • 这给了我“数组到字符串转换”的错误
  • 您需要删除/注释掉您当前在 foreaches 中回显的位置
【解决方案3】:

你可以试试fgetcsv

类似的东西

ini_set('auto_detect_line_endings',TRUE);
$handle = fopen('/path/to/file','r');
while ( ($data = fgetcsv($handle) ) !== FALSE ) {
//process
}
ini_set('auto_detect_line_endings',FALSE);

或者如果你不想自动检测。您可以将分隔符指定为 fgetcsv 的第三个参数

【讨论】:

    猜你喜欢
    • 2017-04-04
    • 2021-11-03
    • 2017-02-15
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2019-12-27
    相关资源
    最近更新 更多