PHP цикл по массиву, сортировка по неделям и подсчет еженедельных рабочих часов - PullRequest
0 голосов
/ 27 декабря 2018

Я перебираю свои дочерние страницы и получаю таблицу, но теперь мне нужно отсортировать и суммировать рабочие часы для каждой недели.

Это мой код:

    $hours = $pages->find('template=arbetstimmar, sort='.$sort.','.$find.', userid='.$uid.',workdate>='.$startd.',workdate<='.$stopd);
    foreach ($hours as $h){?>
    <?php
    $th = $h->worktime + $th; //totalhours
    $tp = $h->worktime * $h->priceperhour;
    $tc = $tp + $tc;
    $date = date("Y-m-d", strtotime($h->workdate));
    $week = date('W', strtotime($date));
    $dow = date('w', strtotime($date));
    $week = (int)$week;
    ?>
    <tr>
        <td><b>(<?php echo $week;?>) <?= $h->workdate;?></b></td>
        <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
        <td><?= $h->workexplanation;?></td>
        <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
        <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
    </tr>
      <?php }?>

Вывод выглядит так:

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

Я пытался использовать операторы if и whileно не могу заставить его работать.

Есть предложения?

Спасибо!

РЕДАКТИРОВАТЬ:

Я разделяю недели:

  $last_date =null;
  $weeklyhours = 0;
  $hours = $pages->find('template=arbetstimmar, sort='.$sort.','.$find.', userid='.$uid.',workdate>='.$startd.',workdate<='.$stopd);
  foreach ($hours as $h){?>
  <?php
  $th = $h->worktime + $th; //totalhours
  $tp = $h->worktime * $h->priceperhour;
  $tc = $tp + $tc;
  $date = date("Y-m-d", strtotime($h->workdate));
  $week = date('W', strtotime($date));
  $week = (int)$week;
  ?>
  <?php
  if ( $last_date != $week ) {
    $weeklyhours = $h->worktime + $weeklyhours;?>
    <tr style="background: #f8f8f8;">
      <td>Vecka: <?= $week;?></td>
      <td></td>
      <td></td>
      <td><?= $weeklyhours;?></td>
      <td></td>
    </tr>
  <tr>
      <td><b><?= $h->workdate;?></b></td>
      <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
      <td><?= $h->workexplanation;?></td>
      <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
      <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
  </tr>

  <?php }
  else if ( $last_date == $week ){
    $weeklyhours = $h->worktime + $weeklyhours;
  ?>

  <tr>
      <td><b><?= $h->workdate;?></b></td>
      <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
      <td><?= $h->workexplanation;?></td>
      <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
      <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
  </tr>

  <?php } 

Теперь проблема в том, что я не могу получить сводку часов за каждую неделю.

Есть ли какие-либо указатели?

Спасибо!

РЕДАКТИРОВАТЬ:

    $weeklyhours = 0;
// NEW LINE HERE - Create an array to use.
$hoursPerWeek = [];
$hours = $pages->find('template=arbetstimmar, sort='.$sort.','.$find.', userid='.$uid.',workdate>='.$startd.',workdate<='.$stopd);
foreach ($hours as $h){?>
<?php
$th = $h->worktime + $th; //totalhours
$tp = $h->worktime * $h->priceperhour;
$tc = $tp + $tc;
$date = date("Y-m-d", strtotime($h->workdate));
$week = date('W', strtotime($date));
$week = (int)$week;
// NEW LINE HERE - Add to array.
$hoursPerWeek[$week] += $h->worktime;
?>
<?php
if ( $last_date != $week ) {?>
  <tr style="background: #f8f8f8;">
    <td>Vecka: <?= $week;?></td>
    <td></td>
    <td></td>
    <td><?= $hoursPerWeek[$week];?></td>
    <td></td>
  </tr>
<tr>
    <td><b><?= $h->workdate;?></b></td>
    <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
    <td><?= $h->workexplanation;?></td>
    <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
    <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
</tr>

<?php }
else if ( $last_date == $week ){?>

<tr>
    <td><b><?= $h->workdate;?></b></td>
    <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
    <td><?= $h->workexplanation;?></td>
    <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
    <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
</tr>

<?php } 
//echo $h->workdate."-".$weeklyhours;
$last_date = $week;
?>
        <?php }?>

1 Ответ

0 голосов
/ 28 декабря 2018

Простой и простой способ «суммировать» часы в неделю, используя массив, в котором ключом является неделя, а значением - сумма часов.

В вашем примере я бы вваш 'foreach' делает следующее:

<?php
// NEW LINE HERE - Create an array to use.
$hoursPerWeek = [];

$hours = $pages->find('template=arbetstimmar, sort='.$sort.','.$find.', userid='.$uid.',workdate>='.$startd.',workdate<='.$stopd);
foreach ($hours as $h){?>
<?php
$th = $h->worktime + $th; //totalhours
$tp = $h->worktime * $h->priceperhour;
$tc = $tp + $tc;
$date = date("Y-m-d", strtotime($h->workdate));
$week = date('W', strtotime($date));
$dow = date('w', strtotime($date));
$week = (int)$week;

// NEW LINE HERE - Add to array.
$hoursPerWeek[$week] += $h->worktime;
?>
<tr>
    <td><b>(<?php echo $week;?>) <?= $h->workdate;?></b></td>
    <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
    <td><?= $h->workexplanation;?></td>
    <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
    <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
</tr>
  <?php }?>

Итак, что я делаю здесь, это сохраняю часы в массиве, для каждого ключа вашей недели.

Чтобы избежать PHPпредупреждения, вы можете захотеть убедиться, что ключ в массиве создан до того, как вы добавите в него значение ..

Надеюсь, что это имеет смысл.

РЕДАКТИРОВАТЬ: чтобы обновить код, чтобы исправить вашу проблему,а также для очистки вашего кода abit, я думаю, это поможет вам.

<?php
// Our data source.
$hours = $pages->find('template=arbetstimmar, sort='.$sort.','.$find.', userid='.$uid.',workdate>='.$startd.',workdate<='.$stopd);

// We need to loop through the array first to use the summed up value later.
$hoursPerWeek = [];
foreach ($hours as $h) {
    $hoursPerWeek[$week] += $h->worktime;
}


$last_date = 0;
$weeklyhours = 0;

// Loop hours again, now make the output.
foreach ($hours as $h) {
    $th = $h->worktime + $th; //totalhours
    $tp = $h->worktime * $h->priceperhour;
    $tc = $tp + $tc;
    $date = date("Y-m-d", strtotime($h->workdate));
    $week = date('W', strtotime($date));
    $week = (int)$week;

    // Previous, was the last of that week.

    if ($last_date != $week) {
    ?>

        <tr style="background: #f8f8f8;">
             <td>Vecka: <?= $week;?></td>
             <td></td>
             <td></td>
             <td><?=$hoursPerWeek[$week];?></td>
             <td></td>
         </tr>

     <?php
     }

     $last_date = $week;

     // Create a output for our current hourlog.
     ?>

     <tr>
         <td><b><?= $h->workdate;?></b></td>
         <td><a href="<?= $h->parent->url;?>#<?=$h->id;?>"><?php echo $h->parent->parent->parent->title. " > ";echo $h->parent->parent->title. " > "; echo $h->parent->title;  ?></a></td>
         <td><?= $h->workexplanation;?></td>
         <td><?= number_format($h->worktime, 2, '.', '')?>h</td>
         <td><?= number_format($h->priceperhour, 2, '.', '')?>€</td>
     </tr>

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