PHP代码正在从多维数组中删除重复项

时间:2013-08-13 21:20:35

标签: php arrays text multidimensional-array explode

我有一个.txt文件,如下所示:

Test = 10849831 = August 6, 2013:
56cake = 0 = August 6, 2013:
Wwe = 812986192 = August 6, 2013:
Test = 346192 = August 9, 2013:

然后,我使用以下PHP代码......

$Output = array();
$Lines = explode(":", $txt);

foreach($Lines as $line) {
    $Rows = array_map('trim', explode(" = ", $line));
    if(!isset($Rows[0], $Rows[1], $Rows[2])) continue;
    $Output[$Rows[0]] = array($Rows[1], $Rows[2]);
}

print_r($Output);

...将.txt文件转换为如下所示的多维数组:

Array
(
    [Test] => Array
        (
            [0] => 346192
            [1] => August 9, 2013
        )

    [56cake] => Array
        (
            [0] => 0
            [1] => August 6, 2013
        )

    [Wwe] => Array
        (
            [0] => 812986192
            [1] => August 6, 2013
        )
)

但是,有一个很大的错误。该代码删除所有重复的数据值。在我的示例txt文件中,我有 TWO 值,名称为“Test”,但代码只在多维数组中输出 ONE

您还可以注意到代码如何将第一个“Test”元素(在多维数组中)的数据替换为最新的(.txt文件中的最后一行)。

数组中第一个“Test”元素的数据 DOES NOT 甚至与.txt文件Test = 10849831 = August 6, 2013:的第一行中的数据匹配。

如何解决此问题?我希望多维数组看起来像这样:

Array
(
    [Test] => Array
        (
            [0] => 10849831
            [1] => August 6, 2013
        )

    [56cake] => Array
        (
            [0] => 0
            [1] => August 6, 2013
        )

    [Wwe] => Array
        (
            [0] => 812986192
            [1] => August 6, 2013
        )

    [Test] => Array
        (
            [0] => 346192
            [1] => August 9, 2013
        )
)

3 个答案:

答案 0 :(得分:1)

您不能在数组中使用相同的键两次。就是这样。

因此,当您添加“新”条目时,旧值将被覆盖。

示例:

$data = array("test" => "Content 1");
$data["test"] = "Content 2";

echo "<pre>" . print_r($data,1) . "</pre>";
//Will give you:
[test] => "Content 2"

答案 1 :(得分:1)

你不能拥有相同的钥匙。在你的情况下测试。 我建议替代

foreach($Lines as $line) {
    $Rows = array_map('trim', explode(" = ", $line));
    if(!isset($Rows[0], $Rows[1], $Rows[2])) continue;
    $Output[] = array('type'=>$Rows[0],'id'=>$Rows[1],'date'=> $Rows[2]);
}

类型,ID,日期;在哪里我的猜测

答案 2 :(得分:0)

正如其他人所指出的那样,您的代码无法提供所需的结果,因为数组不能包含相同的键,因此您的数据将被覆盖。 Dagon的答案存储了所有重复项,但是丢失了使用输入文件每行的第一个元素进行键查找的能力。

保留按键查找功能的替代方法是:

foreach($Lines as $line) {
    $Rows = array_map('trim', explode(" = ", $line));
    if(!isset($Rows[0], $Rows[1], $Rows[2])) continue;
    if (array_key_exists($Rows[0], $Output))
        $Output[$Rows[0]][] = array($Rows[1], $Rows[2]);
    else
        $Output[$Rows[0]] = array(array($Rows[1], $Rows[2]));
}        

$ Output中的每个键都不是直接保存每行中的数据,而是保存一个数组,每个行都有一个元素,文本文件中包含该键。使用示例数据,生成的数组将如下所示:

Array
(
    [Test] => Array
        (   
            [0] => Array
            (
                [0] => 10849831
                [1] => August 6, 2013
            )
            [1] => Array
            (
                [0] => 346192
                [1] => August 9, 2013
            )
        )

    [56cake] => Array
        (
            [0] => Array
            (
                [0] => 0
                [1] => August 6, 2013
            )
        )

    [Wwe] => Array
        (
            [0] => Array
            (
                [0] => 812986192
                [1] => August 6, 2013
            )
        )
)