2016-06-24 6 views
1

나는 세 개의 텍스트 파일로 작업하고 .......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 

지금까지 저는 그것들을 모두 하나의 배열로 파싱했습니다. 다음 출력은 내가 남성에 대한 여성, M의에 성별에 모두 F를 교체해야이 ......

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 개의 파일 모두에서 작은 샘플을 포함하도록 질문을 업데이트 할 수 있습니까? 각각의 두 줄은 위대 할 것입니다. –

+0

if (data_arr [3] == 'F') {'는'if ($ data_arr [3] == 'F') {'여야합니다. – cb0

답변

0

작업을 수행하는 두 가지 기능을 추가하는 것이 좋습니다. 성별의 이름 바꾸기/정규화를위한 도구와 성별을 정규화하는 도구입니다. 그런 다음 루프에서 데이터 값을 처리 할 때 각 함수에 대한 호출을 추가하십시오. 즉, 값을 반복하고 수정 한 다음 최종 배열에 저장합니다.

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 루프는 게시 한 코드에 없습니다. 아마도 최종 배열을 출력하는 데 사용하는 코드의 일부일 것입니다. | 내가 게시 한 것은 메인 루프'myExpldeLoopFunc'뿐입니다. 입력 배열 ('$ data')의 데이터에 대해'foreach'와 루프를 사용합니다. 기본적으로,'$ data_arr' 요소를'$ arr'에 삽입하고 리턴합니다. 이제, 이것을하는 동안 정규화/이름 바꾸기 함수가 호출되어 값을 변경 한 다음 삽입합니다. 그저 한 걸음 씩 밖에 없습니다. 그래서, 결국 :'$ arr'은 표준화되고 이름이 바뀐 값을 포함해야합니다 - 출력 준비. –

+0

나는 그것을 알아 냈고 지금은 효과가있다. –