#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 в цикле. Напишите мне, если необходимо, и я обновлю ответ с более подробным описанием того, как вы можете это сделать.