2017-07-14 14 views
1

私はajaxでページのインプレッションを収集し、jsonファイルに格納します。ループは新しいページオブジェクトを正しく挿入します。問題は、現在のページオブジェクトを新しいインプレッションで更新したいときです。ループ内に既に存在するオブジェクトの値を更新する代わりに、新しいオブジェクトが作成されます。Foreach - キーが既に存在する場合は値を更新します。

ワークフロー:サーバー上の

  • 私はデータ(ページIDと印象を)送信するためにAjaxのポストを作るページが更新されるたびに
  • それから私は、すでに保持している.jsonファイルを読み込みますすべてのページについての情報
  • ファイルが空の場合、新しい配列を作成し、収集したデータをプッシュします
  • 配列に既に同じ値のキー(id)がある場合は、インプレッションキーの値を更新する必要がありますdoesnt仕事)
  • 配列が同じ値とキー(id)を保持していない場合、それは新しいページオブジェクトを作成し、その結果(例でページをリフレッシュした後に予想されるキー

idと印象を保存します以下のidの)同じ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 
    } 
] 
... 

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

実際の結果(アイテム

コメントと私のループ

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

私は時間のために立ち往生し、:)は、また感謝のコメントが追加されますovercomplicateし始めてきました。 – g5wx

関連する問題