2016-06-24 11 views
1

私は3つのテキストファイルで働いています.......PHPで多次元配列のループでstr_replace()を使用するには?

space.txt

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

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

pipe.txt

Smith | Steve | D | M | Red | 3-3-1985 
Bonk | Radek | S | M | Green | 6-3-1975 
Bouillon | Francis | G | M | Blue | 6-3-1975 

今まで私はそれらをすべて1つの配列に解析できました。次の出力は、私が男性にすべてのFの女性への性別では、Mさんを交換する必要が

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 
Abercrombie Neil Male Tan 2/13/1943 
Bishop Timothy Male Yellow 4/23/1967 
Kelly Sue Female Pink 7/12/1959 
Smith Steve D M Red 3-3-1985 
Bonk Radek S M Green 6-3-1975 
Bouillon Francis G M Blue 6-3-1975 

......これさ、およびDOBフォーマットは「/」である必要があります。ここで

は私が情報を解析されたために使用される次のコードです:

<?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); 

$space_array = myExpldeLoopFunc('space', ' ', $parsed_space_data); 
$comma_array = myExpldeLoopFunc('comma', ',', $parsed_comma_data); 
$pipe_array = myExpldeLoopFunc('pipe', ' | ', $parsed_pipe_data); 

$finalArray = array_merge($space_array, $comma_array, $pipe_array); 

function myExpldeLoopFunc($name, $sep, $data) 
{ 
    $parsedData = explode("\r", $data); 

    $arr = []; 

    foreach ($parsedData as $data) { 
     $data_arr = explode($sep, $data); 

     if ($name == 'space') { 
      $arr[] = [ 
      'last_name' => $data_arr[0], 
      'first_name' => $data_arr[1], 
      'middle_initial' => $data_arr[2], 
      'gender' => $data_arr[3], 
      'date_of_birth' => $data_arr[4], 
      'favorite_color' => $data_arr[5], 

      ]; 

      if ($data_arr[3] == 'F') { 
       return str_replace('F', 'Female', $arr); 
      } elseif ($name == 'comma') { 
       $arr[] = [ 
       'last_name' => $data_arr[0], 
       'first_name' => $data_arr[1], 
       'gender' => $data_arr[2], 
       'date_of_birth' => $data_arr[3], 
       'favorite_color' => $data_arr[4], 

       ]; 
      } elseif ($name == 'pipe') { 
       $arr[] = [ 
       'last_name' => $data_arr[0], 
       'first_name' => $data_arr[1], 
       'middle_initial' => $data_arr[2], 
       'gender' => $data_arr[3], 
       'favorite_color' => $data_arr[4], 
       'date_of_birth' => $data_arr[5], 

       ]; 
      } 
     } 

     return $arr; 
    } 
} 

次の結果は、「ヒンギスマルティナMF 1979年4月2日グリーン」と「セレスモニカHF 1973年12月2日ブラック」削除します。それらをすべて置き換えるための最良の解決策は何でしょうか?

+0

最終的に予想される配列をどのように表示する必要がありますか? – RomanPerekhrest

+0

質問を更新して3つのファイルすべての小さなサンプルを含めることはできますか?それぞれからの2本の線は素晴らしいでしょう。 –

+0

if(data_arr [3] == 'F'){'は' if($ data_arr [3] == 'F'){'でなければなりません。 – cb0

答えて

0

私は仕事をするために2つの機能を追加することをお勧めします。 性別の名前を変更する/正規化するためのものと、日付を正規化するためのもの。 そして、ループ内のデータ値を処理するときに、それぞれの関数に呼び出しを追加します。言い換えれば、値を反復して変更し、最終的な配列に格納します。

function renameGender($gender) 
{ 
    if ($gender === 'F') { 
     return str_replace('F', 'Female', $gender); 
    } 
    if ($gender === 'M') { 
     return str_replace('M', 'Male', $gender); 
    } 
} 

function normalizeDate($date) 
{ 
    return str_replace('-', '/', $date); 
} 

function myExpldeLoopFunc($name, $sep, $data) 
{ 
    $parsedData = explode("\r", $data); 

    $arr = []; 

    foreach ($parsedData as $data) { 

     $data_arr = explode($sep, $data); 

     if ($name == 'space') { 

      $arr[] = [ 
       "last_name"  => $data_arr[0], 
       "first_name"  => $data_arr[1], 
       "middle_initial" => $data_arr[2], 
       "gender"   => renameGender($data_arr[3]), 
       "date_of_birth" => normalizeDate($data_arr[4]), 
       "favorite_color" => $data_arr[5] 
      ]; 

     } elseif ($name == 'comma') { 

      $arr[] = [ 
       "last_name"  => $data_arr[0], 
       "first_name"  => $data_arr[1], 
       "gender"   => renameGender($data_arr[2]), 
       "date_of_birth" => normalizeDate($data_arr[3]), 
       "favorite_color" => $data_arr[4] 
      ]; 

     } elseif ($name == 'pipe') { 
      $arr[] = [ 
       "last_name"  => $data_arr[0], 
       "first_name"  => $data_arr[1], 
       "middle_initial" => $data_arr[2], 
       "gender"   => renameGender($data_arr[3]), 
       "favorite_color" => $data_arr[4], 
       "date_of_birth" => normalizeDate($data_arr[5]) 
      ]; 
     } 
    } 

    return $arr; 
} 
+0

私は本当に理解していません。これまでは 'for($ i = 0; $ i '; 'コールバックはどこに追加しますか? –

+0

投稿したコードにforループがありません。これはおそらく、最終配列を出力するために使用しているコードの一部です。 |私が投稿したのはメインループ 'myExpldeLoopF​​unc'だけです。入力配列のデータ( '$ data')に対して' foreach'とループを使います。基本的には '$ data_arr'要素を' $ arr'に挿入して返します。さて、これを実行しながら、正規化/名前変更関数を呼び出して値を変更し、それを挿入します。それは単なる一歩です。ですから、 '$ arr'に正規化され、名前が変更された値が含まれていなければなりません。 –

+0

私はそれを理解して今働いています –