【问题标题】:How to use str_replace() in a loop with multidimensional arrays in PHP?如何在 PHP 中多维数组的循环中使用 str_replace()?
【发布时间】:2016-06-24 09:10:03
【问题描述】:

我正在处理三个文本文件......

空格.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 

逗号.txt

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

管道.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;
    }
}

以下结果删除了“Hingis Martina M F 4-2-1979 Green”和“Seles Monica H F 12-2-1973 Black”。替换它们的最佳解决方案是什么?

【问题讨论】:

  • 你能展示一下最终预期数组的外观吗?
  • 您能否更新您的问题以包含所有 3 个文件中的一个小样本?每个人的几行会很棒。
  • 您在第 44 行缺少$ ` if(data_arr[3] == 'F') {` 应该是 ` if($data_arr[3] == 'F') { `.
  • 您还缺少elseif($name == 'comma') {之前的右括号
  • 问题已更新。我已经尝试使用第 44 行中的 $ 但它没有解决问题。右括号已经存在。

标签: php arrays loops multidimensional-array str-replace


【解决方案1】:

我建议添加两个函数来完成这项工作。 一种用于重命名/规范化性别,另一种用于规范化日期。 然后在循环中处理数据值时添加对每个函数的调用。换句话说:你迭代这些值,修改它们并将它们存储在最终的数组中。

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

【讨论】:

  • 我真的不明白。到目前为止,我使用for ($i=0; $i &lt; count($finalArray); $i++) { echo join(' ', $finalArray[$i]) . '&lt;br&gt;'; 做了一个循环,但我在哪里添加回调?
  • for 循环不在您发布的代码中。这可能是您用于输出最终数组的代码部分。 |我发布的只是主循环myExpldeLoopFunc。它使用foreach 并循环输入数组($data)的数据。基本上,您是将$data_arr 元素插入$arr 然后返回,对吗?现在,在这样做的同时,调用规范化/重命名函数来更改值,然后插入它。这只是中间的一步。所以,最后:$arr 应该包含标准化和重命名的值 - 准备好输出。
  • 很高兴能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
相关资源
最近更新 更多