如何组合来自多个txt文件的所有字符串并在PHP中将它们排序到一个数组中?

时间:2016-06-23 11:09:07

标签: php arrays sorting parsing

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

space.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

comma.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

pipe.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

data.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语句之外,当我打印一个数组时,它只打印每个文件的最后一行。我可以做些什么来简化代码以实现我的目标?

3 个答案:

答案 0 :(得分:0)

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

$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)

答案 1 :(得分:0)

您可以在案件中尝试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);

或者,如果您不想自动检测。您可以将separator指定为fgetcsv的第3个参数

答案 2 :(得分:0)

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

//$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;
}