Iam, используя приведенный ниже код, чтобы получить данные из базы данных и ее работу в порядке, но моя проблема - результат, содержащий повторяющееся значение и не упорядоченное, как я хочу.
$sql=mysqli_query($con,"select user_id, meta_key, meta_value FROM mohamiusermeta where meta_key IN ('websiteurl', 'profile_photo', 'Office', 'address_user', 'agentarea', 'offertext' , 'officename', 'cover_photo', 'membertype') group by user_id");
$newarray = array();
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['officename']=$output['officename'];
$subArray['address_user']=$output['address_user'];
$subArray['profile_photo']=$output['profile_photo'];
$subArray['cover_photo']=$output['cover_photo'];
$subArray['agentarea']=$output['agentarea'];
$subArray['offertext']=$output['offertext'];
$subArray['websiteurl']=$output['websiteurl'];
$subArray['membertype']=$output['membertype'];
$newarray[]= array_filter($subArray);
}
json_encode($newarray);
echo(json_encode($newarray,JSON_UNESCAPED_UNICODE));
mysqli_close();
результат
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"
заранее спасибо
Прежде всего, вы получите SQL-код с кодом. Это потому, что вы выбираете поля user_id, meta_key, meta_value
но группируете результаты по user_id
. Непосредственно выбирать поля, которые не сгруппированы, не допускается. Чтобы решить проблему, удалите предложение GROUP BY
. Вам нужно сгруппировать свой результат программно на PHP.
Проблема вы столкнулись в вашем коде, что Вы заполняете $output
массив Simultaniously для доступа к нему в вашем в 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()
|| is_boolean()
к этому условию.
groupBy(user_id)