Можно ли сохранить поля одного массива как новый массив? - PullRequest
3 голосов
/ 11 ноября 2009

В моем приложении CakePHP я извлекаю результаты из таблицы под названием «Расписания». В этой таблице есть athlete_id и несколько раз для гонки. Мне нужно сделать некоторые расчеты времени одного спортсмена по сравнению с другим спортсменом (например, вычислить разницу между самым быстрым временем финиша и самым медленным).

Я подумал, что лучший способ сделать это - сохранить каждый финиш спортсменов в новом массиве, а затем запустить на нем функцию min (). Ради жизни я не могу заставить это работать ...

Как вы думаете, я подхожу к этому неправильно или я просто что-то упускаю?

foreach ($timesheet['Run'] as $run):
    <tr<?php echo $class;?>>
        <td><?php echo $run['athlete_id'];?></td>
        <td><?php echo $run['start'];?></td>
        <td><?php echo $run['split1'];?></td>
        <td><?php echo $run['split2'];?></td>
        <td><?php echo $run['split3'];?></td>
        <td><?php echo $run['split4'];?></td>
        <td><?php echo $run['split5'];?></td>
        <td><?php echo $run['split6'];?></td>
        <td><?php echo $run['finish'];?></td>
    </tr>
   endforeach

Ответы [ 5 ]

1 голос
/ 11 ноября 2009

Предполагая, что вы выбираете расписание с order by finish asc из базы данных, вы можете сделать что-то вроде этого (пропуская сплит для краткости):

$fastest = $previous = $timesheet['Run'][0]['finish'];
foreach ($timesheet['Run'] as $run):
    <tr>
        <td><?php echo $run['athlete_id'];?></td>
        <td><?php echo $run['finish'];?></td>
        <td><?php echo $previous - $run['finish'];?></td>
        <td><?php echo $fastest - $run['finish'];?></td>
    </tr>
    $previous = $run['finish'];
endforeach

Это должно привести к таким строкам:

id | finished_in | to_previous  | to_best
1  | 120         | 0            | 0
2  | 121.5       | -1.5         | -1.5
3  | 121.8       | -0.3         | -1.8
4  | 122.6       | -0.8         | -2.6
...

Другой вариант - заключить возвращенный массив в Object или, возможно, в ArrayIterator и выполнить вычисления внутри, включая $ fasttest и $ previous и все, что вы захотите вычислить.

0 голосов
/ 11 ноября 2009

По моему мнению, вам нужно изменить способ хранения ваших данных. попытайтесь создать таблицу, содержащую id, event_id, athlete_id и время, которые сделают ваше приложение более гибким и более простым для расчетов.

0 голосов
/ 11 ноября 2009

Я хотел бы использовать что-то вроде usort . Вы можете определить функцию обратного вызова для сортировки массива $ timesheet ['Run'] по клавише 'finish'. В конце первая запись в вашем массиве, если она определена правильно, будет иметь самое короткое время окончания.

Например:

function cmp($a, $b)
{
   if ($a['finish'] == $b['finish'])
   { 
      return 0;
   }

   return ($a['finish'] < $b['finish']) ? -1 : 1;
}

usort($timesheet['Run'], "cmp");
0 голосов
/ 11 ноября 2009

Я рекомендую выполнять вычисления и сортировку в контроллере и в SQL.

0 голосов
/ 11 ноября 2009

Я предполагаю, что у вас есть соответствующие теги вокруг foreach и ';' после endforeach.

Таким образом, возникает вопрос: можете ли вы получить доступ к $ расписанию ['Run'] [0] ['athlete_id']? Вы можете использовать print_r (), чтобы убедиться, что табель $ находится в той форме, в которой вы его считаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...