Объединить один массив (список объектов) с одинаковыми ключами - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь разработать рейтинговую систему с помощью php / mysql.

У меня есть простой объект рейтинга вроде этого: (t - тип рейтинга, r - значение рейтинга)

  [{"t":"1","r":2},{"t":"2","r":4},{"t":"3","r":1},{"t":"4","r":2},{"t":"5","r":2}]

В БД у меня много рейтинговых записей. Вот так:

     object1=> [{"t":"1","r":2},{"t":"2","r":4},{"t":"3","r":1},{"t":"4","r":2},{"t":"5","r":2}]

     object2=> [{"t":"1","r":1},{"t":"2","r":5},{"t":"3","r":3},{"t":"4","r":3},{"t":"5","r":1}]

Короче для вывода мне нужен новый объект вроде этого (мне нужно вычислить средний рейтинг с теми же ключами. )

objectAverageCalculated=> [{"t":"1","r":1.5},{"t":"2","r":4.5},{"t":"3","r":2},{"t":"4","r":2.5},{"t":"5","r":1.5}]

Мой sql:

CREATE TABLE `ratings` (
  `id` int(11) NOT NULL,
  `rating` text NOT NULL,
  `item_id` varchar(16) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



INSERT INTO `ratings` (`id`, `rating`, `item_id`) VALUES
(6, '[{\"t\":\"1\",\"r\":2},{\"t\":\"2\",\"r\":4},{\"t\":\"3\",\"r\":1},{\"t\":\"4\",\"r\":2},{\"t\":\"5\",\"r\":2}]', 'ABC123'),
(7, '[{\"t\":\"1\",\"r\":1},{\"t\":\"2\",\"r\":5},{\"t\":\"3\",\"r\":3},{\"t\":\"4\",\"r\":3},{\"t\":\"5\",\"r\":1}]', 'ABC123');


--
ALTER TABLE `ratings`
  ADD PRIMARY KEY (`id`);



ALTER TABLE `ratings`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8;
COMMIT;

Мой код

$result = mysqli_query($con, "SELECT * FROM ratings WHERE item_id='ABC123' ");
while ($row = mysqli_fetch_array($result)) {
    $tempArray = json_decode($row['rating'], true);
    array_push($ratingsRaw, $tempArray);
}

Я не могу сохранить каждый объект с новой переменной (например, $ item1, $ item2, et c ... )

Как сохранить каждый объект в одном массиве и как получить среднее значение каждого типа рейтинга в одном объекте вывода?

1 Ответ

1 голос
/ 17 июня 2020

Вы можете использовать метод AVG() в своем запросе MySQL и получать среднее значение непосредственно из базы данных.

SELECT AVG(rating) AS avg_rating FROM ratings WHERE item_id='ABC123'

Или когда вы не указываете ID и хотите получить среднее значение для всех шт.

SELECT AVG(rating) AS avg_rating, item_id FROM ratings GROUP BY item_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...