Допустим, у нас есть две таблицы:
users
id login password
1 user1 $432rget5343
2 user2 $432rget5343
3 user3 $432rget5343trips
id date driver_id passengers
1 19-05-2016 1 [2][3]
2 19-05-2016 2 [1][3]
3 19-05-2016 1 [2][3]
4 19-05-2016 1 [2]
По сути, целью всего сценария является отслеживание поездки на работу в группе из нескольких человек. Каждый день за рулем кто-то еще (driver_id)
и мне нужно как-то посчитать, кто должен ехать дальше.
Выше приведены таблицы, которые я придумал, большая часть сценария уже выполнена, но я застрял при подсчете этого.
Из приведенных выше таблиц желаемый результат должен быть:
водитель с идентификатором 1 ехал с пассажирами 2 и 3, поэтому люди с идентификаторами 2 и 3 обязаны «1» тому, у кого идентификатор 1
Парень с ID 2 на этот раз поехал, поэтому его счетчик к парню с ID 1 теперь равен нулю, а три пассажира теперь «должны» +1 для id-1 и +1 для id-2
Идентификатор 1 снова является драйвером, поэтому теперь идентификатор 2 имеет +1 для идентификатора 1, а парень с идентификатором 3 теперь «должен» +2 для водителя с идентификатором 1
1 снова водитель, но он берет только одного пассажира, поэтому парень с идентификатором 2 теперь «должен» +2 для идентификатора 1
Я надеюсь, что мое объяснение понятно. Извините, что вам пришлось так много читать.
Данные в буквальном смысле такие же, как в приведенных выше дампах (в квадратных скобках и т. Д.)
Есть идеи, как сделать это правильно?
Предполагая, что вы не можете изменить структуру базы данных и используете MySQL, вы можете сделать это:
// Set up the connection to the database
$mysqli = new mysqli(HOST, USER, PASS, DBNAME);
// Execute the query
$results = $mysqli->query('SELECT driver_id, passengers FROM trips');
// Here we store all trips records
$records = [];
// Loop through all results
while($row = $results->fetch_array())
{
$driver_id = $row[0];
// If the driver id is not in the records, we add it
if(!array_key_exists($driver_id, $records))
{
$records[$driver_id] = [];
}
// We parse the passenger string and retrieve an array with the ids
$passengers = explode('[', substr(str_replace(']', '', $row[1]), 1));
// We check every passenger
foreach ($passengers as $passenger) {
$passenger_id = intval($passenger);
// As the driver drove the passenger, he owes -1 to him
$records[$driver_id][$passenger_id]--;
// If the passenger's id is not in the records, we add it
if(!array_key_exists($passenger_id, $records))
{
$records[$passenger_id] = [];
}
// We update the passenger debt towards the driver
$records[$passenger_id][$driver_id]++;
}
}
foreach($records as $id => $record)
{
foreach($record as $other_id => $iou)
{
// We are only interested in positive values
if ($iou > 0)
echo "Driver #$id owes driver #$other_id $iou trip(s)</br>";
}
}
Это даст вам следующий результат:
Driver #2 owes driver #1 2 trip(s)
Driver #3 owes driver #1 2 trip(s)
Driver #3 owes driver #2 1 trip(s)
Других решений пока нет …