2017-07-14 31 views
1

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

工作流程:

  • 每次页面刷新我让阿贾克斯后发送数据(页ID和印象)
  • 在服务器上,然后我加载其已经持有的对以.json文件时间有关所有页面的信息
  • 如果文件为空,则我创建一个新阵列并推送收集的数据如果数组已经具有相同值的键(id),则应更新印象数值的值(此不工作)
  • 如果阵列未持有与同价值的关键(ID),那么它会创建新的页面对象,并刷新设置了网页后,所储存的ID和印象的关键

预期结果(例如ID的下面)

[ 
    { 
     id: "page-1", 
     impressions: 15 
    }, 
    { 
     id: "page-2", 
     impressions: 3 
    }, 
    { 
     id: "page-3", 
     impressions: 22 
    } 
] 

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

[ 
    { 
     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 
    } 
] 
... 

我的循环

// 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)); 

回答

2

正确的代码注释:

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 
     ); 
    } 
} 
+0

我一直停留了一个小时,就开始过于复杂:)将添加评论也,谢谢。 – g5wx

相关问题