php mysql - 如何安排数组结果包含键值

时间:2018-01-17 10:29:50

标签: php mysql

我使用下面的代码从数据库中获取数据并且工作正常,但我的问题是结果包含重复值而没有按我的意愿排列。

 1
 user_id    "1"
 Office "مؤسسة السنان للعسل الطبيعي ( عمان )"
address_user    "سلطنة عمان - بانوراما مول"
2   
  user_id   "1"
 Office "مؤسسة السنان للعسل الطبيعي ( عمان )"
address_user    "سلطنة عمان - بانوراما مول"
profile_photo   "profile_photo.jpg"
3   
 user_id    "1"
Office  "مؤسسة السنان للعسل الطبيعي ( عمان )"
address_user    "سلطنة عمان - بانوراما مول"
profile_photo   "profile_photo.jpg"
cover_photo "cover_photo.jpg"

结果

 1
 user_id: "1"
 Office: "officename"
 profile_photo: "profile.jpg
 user_address: "address"
 websiteurl: "url"
 ........

 2
 user_id: "2"
 Office: "officename"
 profile_photo: "profile.jpg
 user_address: "address"
 websiteurl: "url"

但我想得到

{{ absolute_url() }}

提前致谢

1 个答案:

答案 0 :(得分:0)

首先,您的代码会出现SQL错误。这是因为您选择字段user_id, meta_key, meta_value,但是您按user_id对结果进行分组。 不允许直接选择未分组的字段。要解决此问题,请删除GROUP BY子句。您需要以PHP编程方式对结果进行分组。

您在代码中遇到的问题是,您在$output循环中同时填充了while数组。

while($row=mysqli_fetch_assoc($sql)) {
    $subArray=array();

    $output[$row['meta_key']] = $row['meta_value'];

    $subArray['user_id']=$row['user_id'];

    $subArray['Office']=$output['Office']; 
    ...
    $subArray['membertype']=$output['membertype']; 

    $newarray[]= array_filter($subArray);
}

如您所见,您只为每行填充$output数组的一个字段,同时访问每行的所有字段。

您想要做的是将user_id所有的行分组。为此,您可以使用user_id作为输出数组中的键,并将所有元数据添加到其引用的内部数组中:

$newarray = [];
while($row=mysqli_fetch_assoc($sql)) {
    if (!array_key_exists($row['user_id'], $newarray) {
        // Adds a new inner array for the specific user and initializes it with the user_id
        $newarray[$row['user_id']] = ['user_id' => $row['user_id']];
    }
    if (!empty($row['meta_value']) || is_numeric($row['meta_value'])) {
        // Adds a specific meta value to an inner user array
        $newarray[$row['user_id']][$row['meta_key']] = $row['meta_value'];
    }
}

使用此代码,您将获得所需的输出。通过将empty()is_numeric()结合使用作为将元值添加到内部数组的条件,可以消除使用array_filter()的必要性,因为不会存储任何虚假值。如果您的元值也可能是布尔值,则应将|| is_boolean()添加到此条件中。