0

我有一个如下所示的 .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 文件中,我有两个名为“Test”的值,但是代码仅在多维数组中输出一个。

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

数组中第一个“测试”元素的数据甚至与 .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
        )
)
4

3 回答 3

1

数组中不能有两次相同的键。就这样。

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

例子:

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

echo "<pre>" . print_r($data,1) . "</pre>";
//Will give you:
[test] => "Content 2"
于 2013-08-13T21:23:11.177 回答
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,日期;我的猜测在哪里

于 2013-08-13T21:24:56.263 回答
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
            )
        )
)
于 2013-08-13T21:53:08.650 回答