Я пишу несколько тестовых примеров, и мои мысли блуждают, предполагая, что есть лучший способ написать что-то вроде этого. У меня есть список, номера которого переходят от всех нечетных значений ко всем четным, независимо от того, где. Я должен утверждать, что это так, вот что я придумал:
values = [1, 3, 5, 7, 5, 3, 5, 3, 5, 7, 4, 6, 8, 4, 2, 2, 8, 6]
# find all the indexes of odd and even values
odds = [i for (i, v) in enumerate(values) if v % 2 == 1]
evens = [i for (i, v) in enumerate(values) if v % 2 == 0]
# indexes should be a continuous sequence: 0, 1, 2, 3 ... n
assert odds + evens == range(evens[-1] + 1)
Кажется, предстоит долгий путь. автор (id, имя пользователя) и т. д. author_vote (post_id, author_id, value) Значение - tiny_int, которое может быть 1 или -1. Я хочу посчитать ...
У меня есть следующие таблицы:
post (id, title, content) etc
author (id, username) etc
author_vote (post_id, author_id, value)
Значение - tiny_int, которое может быть либо 1, либо -1.
Я хочу подсчитать количество положительных и отрицательных голосов для каждого сообщения :
$posts = sql_select($link, "SELECT post.*, author.username
FROM post, author
AND author.id = post.author_id");
Почему следующий код не работает?
array_walk($posts, function(&$post, $link){
$post['positive'] = sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
AND value = 1");
$post['negative'] = abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $post['id']
AND value = -1"));
});
Я также пробовал следующее, это приводит к тому, что все голоса одинаковы для каждого сообщения:
foreach ($posts as &$post)
{
$id = $post['id'];
$post['positive'] = (int)sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
AND value = 1");
$post['negative'] = (int)abs(sql_select($link, "SELECT SUM(value) FROM author_vote WHERE post_id = $id
AND value = -1"));
}
Также есть ли способ сделать это без необходимости запрашивать базу данных несколько раз для каждого сообщения? Как что-то, что постоянно изменяется [например], может быть (mem) кэшировано?