2016-06-24 5 views
1

Я работаю с тремя текстовыми файлами .......Как использовать str_replace() в цикле с многомерными массивами в PHP?

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 

и до сих пор мне удалось разобрать их все в один массив. Следующий вывод это ......

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 

Я должен заменить все F в области гендерных самка, M, Мале, а формат 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; 
    } 
} 

Следующий результат удаляющий «Хингис Martina MF 4-2-1979 Green» и «Селеш Моника HF 12-2-1973 Black» , Что было бы лучшим решением для их замены?

+0

Вы можете показать, как должен выглядеть окончательный ожидаемый массив? – RomanPerekhrest

+0

Можете ли вы обновить свой вопрос, чтобы включить небольшой образец из всех трех файлов? пара строк из каждого будет великолепна. –

+0

Вам не хватает '$' в строке 44 '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'. Он использует 'foreach' и перебирает данные входного массива (' $ data'). В принципе, вы вставляете элементы '$ data_arr' в' $ arr', а затем возвращаете его, правильно? Теперь, делая это, вызывается функция normalizing/rename, чтобы изменить значение, а затем вставить его. Это всего лишь шаг между ними. Итак, в конце: '$ arr' должен содержать нормализованные и переименованные значения - готов к выходу. –

+0

Я понял, и теперь он работает –

Смежные вопросы