将元素附加到数组并在存在某些值时跳过[PHP]

时间:2017-09-22 12:11:24

标签: php mysql arrays sorting

所以,我正在尝试显示从我的数据库中的表生成的关联数组。这些是我要完成的步骤:

  1. 从已根据列(升序/降序)按特定顺序排序的数据库中获取结果集。
  2. 添加/传输/将结果集中的每个记录/行附加到另一个数组。 在附加过程中,检查我们添加记录的数组是否具有与我们当前添加的记录类似的值(基于不同的列)。
  3. 如果我们要检查的值已经存在,请跳过附加。如果没有,请附加记录并继续循环,直到结果集结束。
  4. 这是我正在使用的示例数据, tbl_user_details Sample data

    如您所见,它已根据 user_pos 列按降序排序。如果查看 user_id 列,我们会有重复的值。我想要实现的是将每个记录添加到数组并根据 user_id column.user_id = 4和 user_pos = 7 跳过重复值。接下来将是 user_id = 2 user_pos = 6 的ada。我们不会添加的下一条记录是带有 user_id = 2 user_pos = 5 的woz,因为我们已经有了 user_id = 2 的人。因此,我们跳过添加具有 user_id = 3 user_pos = 4 的ghopper ......等等。我想这个例子解释了我需要显示的数据流。

    我尝试过一些简单的代码来完成这项工作,但这显然无效。这是片段:

    $query3 = "SELECT * FROM `user_details` ORDER BY `user_details`.`user_pos` DESC";
    
    $user_set = mysqli_query($connection, $query3);
    
      if (!$user_set) {
        die("Database query failed.".mysqli_error($connection));
      }
    
      $user_arr = array();
    
      while ($row = mysqli_fetch_assoc($user_set)) {
    
    if (in_array($row["user_id"], $user_arr)) {
      continue; // skip if we already have this value in array
    }
    
      $user_arr[] = $row;
    
    
    }
    

    应显示的记录包括aswartz,ada,ghopper和rasmusl。其余的都被忽略了。当我使用foreach循环方法在'$ user_arr []'中显示数据时,它仍然显示表中的整个数据。

2 个答案:

答案 0 :(得分:1)

row添加到array时,它将成为多维数组,因此您无法检查其中的user_id。有许多其他解决方案可以检查唯一记录,但最简单的解决方案是将user_id指定为密钥然后检查密钥以进行复制

while ($row = mysqli_fetch_assoc($user_set)) {

if (isset($user_arr[$row["user_id"]])) {
  continue; // skip if we already have this value in array
}

  $user_arr[$row["user_id"]] = $row;


}

注意: 如果您只想要唯一记录,那么您可以在查询中使用DISTINCT

答案 1 :(得分:0)

$tempArr中使用仅包含user_id的其他in_array,在您的代码中,您正在针对数组或整行检查user_id这是用户详细信息,而不仅仅是针对user_ids

$user_arr = array();
$tempArr = array();
while ($row = mysqli_fetch_assoc($user_set)) {
    if (in_array($row["user_id"], $tempArr)) {
        continue; // skip if we already have this value in array
    }
    $user_arr[] = $row;
    $tempArr[] = $row["user_id"];
}