对于我正在研究的这个项目,我有几个约束:
我正在尝试使用上述约束创建一种跟踪错误或问题的方法。所以我想出了使用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对象?
我错过了什么吗?我已经在这一整天了,觉得我错过了一些基本的东西。任何帮助将非常感谢。谢谢你的时间!
答案 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
数据重新编码回文件是一件简单的事情。奇迹般有效!希望这能够帮助其他人。