Как я могу вручную создать массив PHP после его получения из SQL-запроса?

#php #arrays

Вопрос:

У меня есть этот код :

 {...}

$data = $sql->QueryDB("SELECT fdNum AS Num, fdUserNum AS User FROM my_table 
ORDER BY fdNum DESC LIMIT 100;")->fetch_all(MYSQLI_ASSOC);      
echo json_encode($data);
 

В результате я получаю этот массив:.

 [
    {"Num":"195993","User":"345"},
    {"Num":"195992","User":"234"},
    {"Num":"195991","User":"845"}
]
 

Но я хочу использовать функцию для номера пользователя( fdUserNum AS User ) перед выводом, это простая вызываемая функция getUsername() , которая просто находит имя пользователя по номеру пользователя в массиве.

Поэтому, если я должен поместить функцию куда-нибудь в выходной массив, она будет здесь :

 [
    {"Num":"195993","User":"getUsername(345)"},
    {"Num":"195992","User":"getUsername(234)"},
    {"Num":"195991","User":"getUsername(845)"}
]
 

Но я, кажется, не могу понять, как так расчленить массив, и мне не повезло с поиском в Интернете.

Знаете ли вы, как это достижимо ?

Комментарии:

1. Что бы getUsername я сделал? Еще один вопрос? Если это так, то в этом нет необходимости. Для этой цели мы используем JOIN s (для получения соответствующих данных из других таблиц). Если это не другой запрос, то просто исследуйте сопоставление массивов.

2. Хорошо. Да, это так. Поскольку таблица не находится в одной и той же базе данных, но даже в этом случае я все равно хотел бы знать, как выполнить заданный вопрос, чтобы я также мог выполнять обычные функции

3. Ну, в таком случае, это сопоставление массивов.

Ответ №1:

Если имя пользователя также хранится в базе данных, вы захотите сделать это с помощью соединения в SQL:

 SELECT 
    user.username,
    ...
FROM 
    my_table, user 
WHERE 
    my_table.fdUserNum = user.userNum 
...
 

Если у вас есть имя пользователя, сохраненное в самом приложении или во внешней службе (в этом случае имейте в виду, что вы будете делать 100 запросов к этой службе и, вероятно, было бы лучше, если бы запросы группировались), getUsername() функция должна работать нормально:

 foreach ($data as amp;$row) { 
    $row['User'] = getUsername($row['User']); 
}

unset($row);
 

Строка используется amp; в качестве ссылки, что позволяет напрямую изменять содержимое внутреннего массива. unset После цикла, чтобы убедиться, что вы случайно не измените последний $row после цикла.

Вы также можете сделать это с помощью индекса:

 foreach ($data as $idx => $row) { 
    $data[$idx]['User'] = getUsername($row['User']); 
}
 

Вы также можете использовать array_map заполнение ключа и возврат результирующего массива, эффективно заменяя старый в массиве:

 function populateUsername($row) {
    $row['User'] = getUsername($row['User']);
}

$data = array_map('populateUsername', $data);
 

Комментарии:

1. Эй! Объединение таблиц невозможно, потому что таблицы находятся в двух разных базах данных, но я попробовал второй метод! Это работает как заклинание! Спасибо

2. @Финнеас. В будущем я рекомендую вам изменить функцию GetUserName в этом случае, чтобы принять список идентификаторов пользователей, чтобы вы могли просмотреть их все в другой базе данных в виде одного запроса. Затем вы возвращаете список пользователей в виде uid => username карты и вместо этого просматриваете uid в цикле. Напишите мне, если необходимо, и я обновлю ответ с более подробным описанием того, как вы можете это сделать.