php - 如何访问数组(json)中对象的位置并通过php更改其值
问题描述
我必须访问数组并更改选择修改和覆盖旧的成员的数据,我已经尝试了几次,但除了添加它而不是删除它之外什么也没做。
我尝试通过它的索引传递元素的位置,但它并没有替换它。即使通过其独特的身份查看。
第一个元素必须覆盖第二个元素,而是在数组的开头创建一个新元素。json
[
{
"surname": "",
"name": "Andrea Fiore",
"city": "Crocino",
"address": "via Emo Mannucci, 2",
"telephone": "123456789",
"email": "x@gmail.com",
"startData": "2019-07-04",
"finishData": "2019-07-25",
"cardId": "2",
"state": "true"
},
{
"surname": "Fioregg",
"name": "Andrea Fiore",
"city": "Crocino",
"address": "via Emo Mannucci, 2",
"telephone": "123456789",
"email": "x@gmail.com",
"startData": "2019-07-04",
"finishData": "2019-07-25",
"cardId": "2",
"state": "true"
}
]
我用来尝试修改成员的最后一个代码。php
<?php
$getOldData = "data.php";
$elaborateNewMember = array();
try
{
$contenentData = file_get_contents($getOldData);
$elaborateNewMember = json_decode($contenentData, true);
$find = array_filter($elaborateNewMember, function($searchMember) {
return $searchMember['cardId'] == $_POST['cardId'];
});
if(count(($indexs = array_keys($find))) == 1) {
$elaborateNewMember[indexs[0]] = array(
'surname'=> $_POST['surname'],
'name'=> $_POST['name'],
'city'=> $_POST['city'],
'address'=> $_POST['address'],
'telephone'=> $_POST['telephone'],
'email'=> $_POST['email'],
'startData'=> $_POST['startData'],
'finishData'=> $_POST['finishData'],
'cardId'=> $_POST['cardId'],
'state'=> $_POST['state'],
);
$contenentData = json_encode($elaborateNewMember, JSON_PRETTY_PRINT);
if(file_put_contents($getOldData, $contenentData)) {
echo 'Aggiornamento riuscito.';
}
else
echo "Errore.";
}
}
catch (Exception $e) {
echo 'Eccezione: ', $e->getMessage(), "\n";
}
?>
我试过这个,但在 json 文件中添加成员以更改索引为“i”的新对象。
解决方案
您可以使用array_filter
来保留数组键。
$data = json_decode(file_get_contents('data.php'), true);
$filter = array_filter($data, function($row) {
return $row['email'] == $_POST['email']; // Assuming this is unique
});
如果返回匹配项,并且只有一个,您可以更新数据中的该索引。
if(count(($indexs = array_keys($filter))) == 1) {
$data[$indexs[0]] = array(
'surname'=> $_POST['surname'],
'name'=> $_POST['name'],
'city'=> $_POST['city'],
'address'=> $_POST['address'],
'telephone'=> $_POST['telephone'],
'email'=> $_POST['email'],
'startData'=> $_POST['startData'],
'finishData'=> $_POST['finishData'],
'cardId'=> $_POST['cardId'],
'state'=> $_POST['state'],
);
}
然后只需重新写入文件。在此处查看工作演示
如果您要为其更新数组的该用户有多个电子邮件,则可以遍历索引。
if(count(($indexs = array_keys($filter))) >= 1)
foreach($indexs as $key)
$data[$key] = array(
'surname'=> $_POST['surname'],
'name'=> $_POST['name'],
'city'=> $_POST['city'],
'address'=> $_POST['address'],
'telephone'=> $_POST['telephone'],
'email'=> $_POST['email'],
'startData'=> $_POST['startData'],
'finishData'=> $_POST['finishData'],
'cardId'=> $_POST['cardId'],
'state'=> $_POST['state'],
);
推荐阅读
- postgresql - 使用 pyspark 连接到 Presto SQL 目录并在 postgresql db 上执行查询的 Pyspark 代码或步骤?
- php - Laravel 关系澄清
- c - C 文本对齐与填充
- ember.js - 在 EmberJS 中向外部 API 发出 PUT 请求的推荐方法是什么?
- javascript - 如何在firebase上自动删除消息
- python-3.x - 解码 base64 字符串的字典会产生错误
- reactjs - React 应用程序不支持导出 { default }
- javascript - Highstocks:“columnrange”列总是均匀分布的。如何让 highstocks 显示数据中的任何差距?
- react-native - 使用带有 React Native 的离线图像的技巧
- c - `getline` 挂起而不关闭管道[1]