php mysql - как расположить в массиве результаты, содержащие значение ключа

0

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"

заранее спасибо

  • 0
    использовать groupBy(user_id)
Теги:

1 ответ

0

Прежде всего, вы получите 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() к этому условию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню