如何使用日期范围从表中查询多个详细信息来获取数据?

时间:2020-07-06 20:15:23

标签: php

我已经可以使用表格下方的代码从该表格中获取多个详细信息...

我知道表看起来很奇怪,但这是客户端可用的数据表。

instance

下面是我用来获取详细信息的代码:

$ curl http://1.2.3.4:9100/metrics | grep instance
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 80082    0 80082    0     0  4383k      0 --:--:-- --:--:-- --:--:-- 4600k

$ curl http://1.2.3.4:9100/metrics | grep rkv1701
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 80085    0 80085    0  node_uname_info{domainname="(none)",machine="x86_64",nodename="rkv1701.myco.com",release="4.17.13-1.el7.elrepo.x86_64",sysname="Linux",version="#1 SMP Mon Aug 6 14:16:00 EDT 2018"} 1
   0  9268k      0 --:--:-- --:--:-- --:--:-- 9776k
$

现在我要做的是获取下面的日期范围,以帮助仅显示来自 id | class | gender | e1 | e2 | d1 | d2 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 | class1 | male | ,first, first, first | ,first, first, first | , 2019-12-24,2019-12-24,2019-12-24 | ,2019-12-04,2019-11-21,2019-11-20 | 2 | class2 | female | ,second, second, second | ,second, second, second | ,2019-12-04,2019-11-21,2019-11-20 | , 2019-12-20,2019-12-20,2019-12-20 3 | class3 | male | ,first, first, first | ,third, third, third | ,2019-12-06,2019-12-13,2019-12-19 | ,2019-12-06,2019-12-13,2019-12-19 4 | class4 | male | ,third, third, third | ,third, third, third | ,2019-12-20,2019-12-20,2019-12-20 | ,2019-12-24,2019-12-24,2019-12-24 5 | class5 | female | ,second, second | ,third, third, third | ,2019-12-24,2019-12-24,2019-12-24 | ,2019-12-24,2019-12-24,2019-12-24 $datfrm ="00/00/0001"; $datto ="31/12/2099"; $gender="male"; $place_map = ['first' => 1, 'second' => 0.8, 'third' => 0.4]; //e1view $query = "SELECT e1 FROM eyfstb WHERE gender = '$gender'"; // perform the query ... if ($result = $db->query($query)) { $finalScore1 = 0; $scores=""; $last_score=""; /* fetch associative array */ while ($row = $result->fetch_assoc()) { $efind = $row['e1']; if (substr_count($efind, ",") >'2'){ $scores = explode(',', $row['e1']); $last_score = trim($scores[count($scores)-1]); $finalScore1 += $place_map[$last_score]; } } } //e2view $query = "SELECT e2 FROM eyfstb WHERE gender = '$gender'"; // perform the query ... if ($result = $db->query($query)) { $finalScore2 = 0; $scores=""; $last_score=""; /* fetch associative array */ while ($row = $result->fetch_assoc()) { $efind = $row['e2']; if (substr_count($efind, ",") >'2'){ $scores = explode(',', $row['e2']); $last_score = trim($scores[count($scores)-1]); $finalScore2 += $place_map[$last_score]; } } } 的记录

实际上我在下面尝试过此方法,但出现错误:

$datfrm

但是现在有了下面我尝试过的代码,我遇到了更多错误:

$datto

以下是显示的错误以及一个答案,我不确定它是否正确:

//Filter out dates between start and end date
$d1result = array_filter($d1view, function($data_item) use($datfrm,$datto) {
    return $data_item >= $datfrm && $data_item <= $datto;
});

$e1result = array_intersect_key($e1view, $d1result);

我想要的结果是只获取e1和e2中位于d1和d2日期范围内的值 如果e1或e2字段中有2个文件,则我不希望它显示或映射任何内容。

5 个答案:

答案 0 :(得分:1)

您想跳过e1字段中没有3个元素的行。行后: $efind = explode(',', $efind);,添加此:

if (count($efind) !== 3) {
    continue;
}

在两个地方都添加它。


代码中的另一个问题是,当您尝试比较日期时,您将字符串与<=>=进行比较。您应该改用strcmp()

在不了解表的全部内容的情况下,很难看到未定义索引错误的来源。

答案 1 :(得分:1)

首先,将日期更改为

$datfrm ="00/00/0001";
$datto ="31/12/2099";

$datfrm ="00-00-0001";
$datto ="31-12-2099";

然后添加

    if (empty($last_score)) {
      $last_score=0;
    }else{

    }
    

之间

$last_score = trim($scores[count($scores)-1]);

$finalScore15 += $place_map[$last_score];

应该可以完全解决您的问题。

答案 2 :(得分:0)

我希望这会有所帮助

    <?php 
  

$Date1 = '01-10-2010'; 
$Date2 = '07-12-2010'; 
  

$array = array(); 
$range = 0;

$Variable1 = strtotime($Date1); 
$Variable2 = strtotime($Date2); 
  

for ($currentDate = $Variable1; $currentDate <= $Variable2;  
                                $currentDate += (86400)) { 
                                      
$Store = date('Y-m-d', $currentDate); 
$array[] = $Store;
$range++;

} 
for ($i=0; $i < $range; $i++) { 
    echo $array[$i];
}
  


?> 

答案 3 :(得分:0)

我在准确地了解您想要从e1和e2中获取什么时遇到了一些麻烦-假设它只是该字段中的最后一个值。如果我弄错了,可以在$ eview函数中更正它。

这里的代码使用您发布的数据得出的结果为4.2。

$datfrm = "";       // or something like '2010-01-01'
$datto = '2200';    // or something like '2015-12-01'

$gender="male";

$place_map = ['first' => 1, 'second' => 0.8, 'third' => 0.4];

// My understanding of the code is to get the weighted value of the
// last word in the column - if that's wrong, you can change this
// I am assuming you want the date that corresponded to the item you used
// for the final score, so if wrong, you need to change this.
// Also assume there will be the same number of dates as 'e's
//
// return false if bad value, or 0 if not in date range
$eview = function ($row, $ecol, $dcol) use ($place_map, $datfrm, $datto) {
    $parts = array_filter(array_map('trim', explode(",", $row[$ecol])));
    $dates = array_filter(array_map('trim', explode(",", $row[$dcol])));
    if (!$parts || count($parts) != count($dates)) {
        echo "Expected same number of parts and dates!\n";
        return false;
    }
    $date = array_pop($dates);      // Getting last date...
    return ($date >= $datfrm && $date < $datto) ?
           ($place_map[array_pop($parts)] ?? false) : 0;
    };

$finalScore1 = $finalScore2 = 0;

// perform the query ...
$query = "SELECT e1, e2, d1, d2 FROM eyfstb WHERE gender = '{$gender}'";
if ($result = $db->query($query)) {
        /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
      $finalScore1 += $eview($row, 'e1', 'd1') ?: 0;
      $finalScore2 += $eview($row, 'e2', 'd2') ?: 0;
    }
}

echo ($finalScore1+$finalScore2) . "\n";

答案 4 :(得分:0)

你在做

if ($result = $db->query($query)) {
    $finalScore1 = 0;
   ......
}

if ($result = $db->query($query)) {
   $finalScore2 = 0;
   .......
}


echo ($finalscore +$finalscore2);

尝试做:

$finalScore1 = 0;
if ($result = $db->query($query)) {
   ......
}

$finalScore2 = 0;
if ($result = $db->query($query)) {
   .......
}


echo ($finalscore +$finalscore2);

您还没有定义,请首先定义:

$place_map = ['first' => 1, 'second' => 0.8, 'third' => 0.4];

希望这些可以解决您的错误,并根据数据和代码恢复结果