过滤阵列并获取不同的条目

时间:2018-10-10 18:25:55

标签: php arrays

当前,我正在收集台式机和移动设备的数量...根据ARRAY中的总计项目,计数正确返回了。但是,现在我需要删除重复项...示例user_id = 001可以有10个IOS条目...所以我需要做类似的事情... IF $row['last_login'] Date()是最新的,然后获取该条目并计为1。user_id = 001的最终结果将是1个条目计数,而不是10个(我现在要知道)。

if ($results = $dbh->runQuery($sql)) {
    foreach ($results as $key=>$row){ 
        $users[$row['user_id']][] = array('user_id'=>$row['user_id'],
            'racid' => $row['racid'],
            'email' => $row['email'],
            'last_login' => $row['last_login'],
            'fname' => $row['fname'],
            'lname' => $row['lname'],
            'role_id' => $row['role_id'],
            'role_name' => $row['role_name'],
            'ios_device_token' => $row['ios'],
            'roid_device_token' => $row['roid'],
            'p_name' => $row['p_name']);

            if($row['ios'] !== null && $row['ios'] !== '' && $row['ios'] !== '-1'){
                $ios_count++;
            }

            if($row['android'] !== null && $row['android'] !== '' && $row['android'] !== '-1'){
                $android_count++;
            }

        $invalidValues = [null, "", -1];

        if(in_array($row['ios'], $invalidValues) && in_array($row['android'], $invalidValues)){
            $desktop_count++;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

使用关联数组,您可以按照自己的标准“区分”。类似于以下代码。

但是@esqew说(评论您的问题)有关更改SQL而不是PHP的说法可能是一个更清洁的角度,尤其是因为PHP通常非常慢。

if ($results = $dbh->runQuery($sql)) { // that exists already
  $latestEntries = []; // assoc. array: key=user, value=row
  foreach ($results as $row) { // that exists already
    // assuming 'last_login' is a timestamp or any format that can be used in inequality
    // otherwise cook your own comparison function
    if (
      !$latestEntries[$row['user_id']]
      || $latestEntries[$row['user_id']]['last_login'] < $row['user_id']['last_login']
    ) {
      $latestEntries[$row['user_id']] = $row;
    }
    // rest of your code that exists already
  }
  // here, after the loop, $latestEntries has the latest entry for each user found in $results
}