首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Foreach -如果键已经存在,则更新值

Foreach -如果键已经存在,则更新值
EN

Stack Overflow用户
提问于 2017-07-14 16:27:02
回答 1查看 1.2K关注 0票数 1

我正在通过ajax收集页面的印象,然后将它们存储在json文件中。循环正确插入新页对象。问题是当我希望用新的印象更新当前的页面对象时,我的循环创建一个新的对象,而不是更新数组中已经存在的对象的值。

工作流:

  • 每次刷新页面时,我都会发出ajax帖子来发送数据(页面id和印象)。
  • 然后在服务器上加载.json文件,该文件已经保存了所有页面的信息。
  • 如果文件为空,则创建一个新数组并推送收集的数据。
  • 如果数组已经有一个具有相同值的键(id),那么它应该更新印象键的值(这不起作用)
  • 如果数组不持有具有相同值的键( id ),则会创建新的页面对象并存储id和印象键。

预期结果(例如,在使用id的下面刷新页面之后)

代码语言:javascript
复制
[
    {
        id: "page-1",
        impressions: 15
    },
    {
        id: "page-2",
        impressions: 3
    },
    {
        id: "page-3",
        impressions: 22
    }
]

实际结果(具有相同id的项不更新,而是作为新项创建)

代码语言:javascript
复制
[
    {
        id: "page-1",
        impressions: 4
    },
    {
        id: "page-2",
        impressions: 2
    },
    {
        id: "page-1",
        impressions: 3
    },
    {
        id: "page-3",
        impressions: 2
    },
    {
        id: "page-1",
        impressions: 2
    }
    {
        id: "page-1",
        impressions: 1
    },
    {
        id: "page-2",
        impressions: 1
    },
    {
        id: "page-3",
        impressions: 1
    }
]
...

我的循环

代码语言:javascript
复制
// If array exists
if ($pages > -1) {
    // Loop thro all the items
    foreach ($pages as $item) {
        // If item exists, update it. Else create a new one
        if ($item -> id == $id) {
            $item -> impressions = $item -> impressions + 1;
        } else {
            $pages[] = array(
                'id'          => $id,
                'impressions' => 1
            );
        }
    }
}
// else create new one
else {
    $pages = array();
    $pages[] = array(
        'id'          => $id,
        'impressions' => 1
    );
}
// Store the array in file
file_put_contents($url, json_encode($pages));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 16:32:01

适当的代码和注释:

代码语言:javascript
复制
if ($pages > -1) {
    $impression_found = false;
    foreach ($pages as $item) {
        if ($item -> id == $id) {
            // you have found the impression - update it
            $item -> impressions = $item -> impressions + 1;
            $impression_found = true;

            // you can even `break` foreach as you already found your impression:
            break;
        } else {
            // DO NOTHING
        }
    }
    // This is really a new impression, add it
    if (!$impression_found) {
        $pages[] = array(
            'id'          => $id,
            'impressions' => 1
        );
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45107697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档