为什么这个json_encoded字符串不返回第四个元素?

时间:2018-05-01 06:07:29

标签: php json foreach

我试图回复一个简单的json_encoded文件。

<?php
$allMessages = file_get_contents("chatmessages.txt");

$allMessagesArr = explode(PHP_EOL, $allMessages);
$newObj = [];
var_dump($allMessagesArr);
foreach ($allMessagesArr as $thisLine) {
    // echo($thisLine . "\n");
    if (empty($thisLine) ) {

    } else {
        $thisLineArr = explode("|", $thisLine);

        $newObj[trim($thisLineArr[0])] = trim($thisLineArr[1]);
        // echo("here comes another one ".$thisLineArr[0] . " : ". $thisLineArr[1]."\n");
    }
}
$newObjForFront = json_encode($newObj);
echo($newObjForFront);

chatmessages.txt看起来像这样

bob|hello
jimmy|second try incoming again
sam|third try

bob|oh damn

我已经回显了循环中的每一行,并出现了第四个元素。但是,当我回复$ newObjForFront时,它错过了最后一个元素。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

中创建最终数组$newObj
$newObj[trim($thisLineArr[0])] = trim($thisLineArr[1]);

您使用名称作为数组的索引。由于数组索引必须是唯一的,这意味着实际上最后一个条目会覆盖第一个条目,因此您的实际输出是......

{"bob":"oh damn","jimmy":"second try incoming again","sam":"third try"}

所以它实际上是第一条缺失的消息。

修改

如果您想拥有所有消息,则可以使用

存储它们
$newObj[] = [ "user"=> trim($thisLineArr[0]), "msg" =>trim($thisLineArr[1])];

哪个会输出为...

[{"user":"bob","msg":"hello"},{"user":"jimmy","msg":"second try incoming again"},{"user":"sam","msg":"third try"},{"user":"bob","msg":"oh damn"}]

答案 1 :(得分:0)

$newObj[trim($thisLineArr[0])] = trim($thisLineArr[1]);此行将使用任何用户名的最后一条消息替换值。如果任何用户名有多条消息,则只有最后一条消息将存储在数组中。

通过创建多维,您可以使用相同的用户名存储多条消息。检查以下可能对您有帮助的代码

$newObj[][trim($thisLineArr[0])] = trim($thisLineArr[1]);