PHP - 如何将数字索引数组附加到数字索引的StdClass对象?

时间:2016-02-12 17:18:35

标签: php json stdclass

对于我正在研究的这个项目,我有几个约束:

  1. 纯HTML / CSS / JavaScript(或JS插件)
  2. 可以使用PHP脚本,但不能用于页面/视图
  3. 无法使用数据库
  4. 保持简单
  5. 我正在尝试使用上述约束创建一种跟踪错误或问题的方法。所以我想出了使用JavaScript(用jQuery)通过ajax将帖子数据发送到php脚本。然后脚本检查是否存在issues.json文件,如果不存在,则创建它。

    如果它存在或已经创建,那么我使用file_get_contents()函数和json_decode()函数将其转换为PHP数组,或者在这种情况下为StdClass Object

    然后我想将$_POST数据(在卫生设施之后,即使这是一个内部工具)附加到json文件中找到的数据。然后我将用所有新的(和旧的)数据重写json文件。是的,我几乎像贫民窟数据库一样使用它,但它符合我的约束!

    JSON 示例

    {
        "0": {
            "name": "John Doe",
            "email": "user@domain.com",
            "date": "2017-01-02",
            "issue_name": "Something",
            "issue_desc": "it's something for sure."
        }
    }
    

    PHP 我已经排除了卫生,检查和文件重写,因为我只是想让这件作品先行。

    <?php
    //Get the existing data.
    $existing_data = file_get_contents("../json/issues.json");
    $decoded = json_decode($existing_data);
    
    //For Testing purposes
    echo "<pre>";
        print_r($decoded);
    echo "</pre>";
    
    if(!empty($_POST)) {
        $_POST = (object) $_POST;
    
        $newData = array_merge((array)$decoded, array($_POST));
    
        //For Testing purposes
        echo "<pre>";
            print_r($newData);
        echo "</pre>";
    }
    
    $json = json_encode($newData);
    
    echo $json;
    

    此交易的结果是:

    Array
    (
        [0] => stdClass Object
            (
                [name] => John Doe
                [email] => user@domain.com
                [date] => 2017-01-02
                [issue_name] => Something
                [issue_desc] => it's something for sure.
            )
    
        [0] => Array
            (
                [name] => John Doe
                [email] => john.doe@domain.net
                [date] => 2016-02-12
                [issue_title] => Problem with software
                [issue_desc] => the description of the problem
            )
    
    )
    

    我意识到将数组转换为对象的问题,反之亦然,如上所述。但是,我似乎无法像我想要的那样工作。

    我尝试过使用ArrayObject::append()

    $arrayobj = new ArrayObject($decoded);
    $arrayobj->append($_POST);
    

    我得到一些奇怪的输出:

    ArrayObject Object
    (
        [storage:ArrayObject:private] => Array
            (
                [name] => John Doe
                [email] => john.doe@domain.net
                [date] => 2016-02-12
                [issue_title] => Problem with software
                [issue_desc] => the description of the problem.
                [0] => stdClass Object
                    (
                        [0] => stdClass Object
                            (
                                [name] => John Doe
                                [email] => user@domain.com
                                [date] => 2017-01-02
                                [issue_name] => Something
                                [issue_desc] => it's something for sure.
                            )
    
                    )
    
            )
    
    )
    

    我也尝试了array_merge()(参见代码)但是没有对象/数组转换它会抛出一个关于StdClass对象如何不是一个数组的错误(显然)。使用array_merge()函数的结果,就像我在代码中的方式一样,是我想要的最接近的(到目前为止)。

    所需输出

    stdClass Object
    (
        [0] => stdClass Object
            (
                [name] => John Doe
                [email] => user@domain.com
                [date] => 2017-01-02
                [issue_name] => Something
                [issue_desc] => it's something for sure.
            )
    
        [1] => stdClass Object
            (
                [name] => John Doe
                [email] => john.doe@domain.net
                [date] => 2016-02-12
                [issue_title] => Problem with software
                [issue_desc] => the description of the problem
            )
    
    )
    

    我希望键增加,它会自然地完成(如果我这样做&#34;右键#34;),所以我可以添加尽可能多的数据。

    那么,现在回答我的问题(最后):如何将数字索引数组(包含$_POST信息)附加到PHP中用数字索引的StdClass对象?

    我错过了什么吗?我已经在这一整天了,觉得我错过了一些基本的东西。任何帮助将非常感谢。谢谢你的时间!

2 个答案:

答案 0 :(得分:0)

更新的

检查我的代码,按照要求运行:

$decoded = json_decode('{
    "0": {
        "name": "John Doe",
        "email": "user@domain.com",
        "date": "2017-01-02",
        "issue_name": "Something",
        "issue_desc": "it\'s something for sure."
    }
}');

$_POST = array('name' => 'test');

$merged = (object)array_merge((array)$decoded, array((object)$_POST));
print_r($merged);

这给了我:

stdClass Object
(
    [0] => stdClass Object
        (
            [name] => John Doe
            [email] => user@domain.com
            [date] => 2017-01-02
            [issue_name] => Something
            [issue_desc] => it's something for sure.
        )

    [0] => stdClass Object
        (
            [name] => test
        )

)

答案 1 :(得分:0)

我意识到所有的铸造和拆卸都会让剧本膨胀。所以我做了更多的研究,询问了一些同事,这就是我想出来的:

//Get the existing data.
$existing_data = file_get_contents("../json/issues.json");
$decoded = json_decode($existing_data, true);

//Check if we're dealing with POST data
if(!empty($_POST)) {
    if(!empty($decoded)) {
        // Use array_unshift to put the newest issues at the beginning of the array, so they don't have to be sorted by date.
        array_unshift($decoded, $_POST);
    } else {
        $decoded = array();
        // Use array_unshift to put the newest issues at the beginning of the array, so they don't have to be sorted by date.
        array_unshift($decoded, $_POST);
    }
}

//Put the existing data.
$json = json_encode($decoded);
file_put_contents("../json/issues.json", $json);

<强>释 首先,我获取issues.json文件的文件内容,并将其解码为PHP数组,将$assoc参数设置为true,这样它将返回一个数组,而不是每kunruh's suggestion个对象。

然后我只是检查我们是否从$_POST获取数据,如果我们是,我会检查我们是否从$decoded获取数据。因为如果.json文件为空,则在尝试将数组位推送到null时会导致内部服务器错误。所以为了防止这种情况,我制作了一个空数组,然后推到了那个。

在那个逻辑之后,重新编码它并将put数据重新编码回文件是一件简单的事情。奇迹般有效!希望这能够帮助其他人。