【问题标题】:Replace newest n datetimes in array替换数组中最新的 n 个日期时间
【发布时间】:2014-06-27 20:43:28
【问题描述】:

我正在尝试从 MYSQLi 查询中替换不是最旧 2 的数组中的所有日期时间值。我尝试使用查询获取结果,但它似乎太复杂了,因为我需要多次执行此操作列。有没有办法用 PHP 做到这一点?

如果:

$row["item"] =
"2014-01-01 00:00:00 2014-04-04 00:00:00 2014-02-02 00:00:00 2014-03-03 00:00:00"

返回:

$row["item"] = 
"2014-01-01 00:00:00 new 2014-02-02 00:00:00 new"

更新

抱歉,我可能弄错了...如果我的会员列表是在 while 循环中创建的,是否甚至返回了一个数组,或者每次传递都返回了一个 $row["item1"], $row["item2"], etc.?我面临的挑战是比较每列(item1 - item10)的多行(我的成员)之间的日期时间。

当前计数器将项目限制为 12,但不考虑日期时间...

while ($row = mysqli_fetch_array($result)){

  if($row["item1"]!="0000-00-00 00:00:00"){ // if datetime is set
    $item1cnt++;                            // add one to counter
    if($item1cnt > 12){                     // if counter is greater than 12
      $row["item1"]="";                     // itemx = ""
    }else{                                  // if counter is less than 12
      $row["item1"]="item1";                // item = itemx
    }
  }else{                                    // if datetime is not set
      $row["item1"]="";                     // itemx = ""
   }

// repeat above for all 10 items


// part of member's listing used by jquery to filter services
$items[] = "<li class=\"services " . $row["item1"] . " " . $row["item2"] . " " . $row["item3"] . " " . $row["item4"] . " " . $row["item5"] . " " . $row["item6"] . " " . $row["item7"] . " " . $row["item8"] . " " . $row["item9"] . " " . $row["item10"] . "\">";

  }

//an example situation for listings...the first twelve list their services
<li class="services item1 item2 item3 item4       item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">
<li class="services item1 item2 item3 item4 item5 item6 item7 item8 item9 item10">

//then another lists for all 10 services(items) but only item5 is available. The
 current code accomplishes this.
<li class="services                         item5                               ">

但是,如果第一个成员决定提供item5,它将把新人推开。所以我需要使用日期时间来建立排名。

解决方案

我的sql 查询现在对每个项目使用LEFT JOINLIMIT。 @DarkSide 提供了解决方案here

【问题讨论】:

  • 您能详细说明一下 MYSQLi 查询吗?也许有更好的方法,因为串联的日期时间字符串感觉不对
  • 这里是 my attempt 使用 MYSQLi
  • here 是我尝试完成的一个很好的例子。注意:我实际上需要保留最旧的 12 个,并替换剩余的日期时间,但为简单起见将其缩短为两个 :)

标签: php datetime


【解决方案1】:

我认为你对你想要完成的事情有很好的 SQL 查询 https://stackoverflow.com/a/24225215/350021

但这是您当前问题的答案:

function transformItems($items, $preserve) {
    $items = array_map('rtrim', str_split($items, 20));
    asort($items);
    array_walk($items, function(&$val, $key, &$i) {
        if (--$i < 0) {
            $val = 'new';
        }
    }, $preserve);
    ksort($items);
    return implode(' ', $items);
}

// sample usage
$row["item"] = "2014-01-01 00:00:00 2014-04-04 00:00:00 2014-02-02 00:00:00 2014-03-03 00:00:00";
$row['item'] = transformItems($row['item'], 2);
// result: "2014-01-01 00:00:00 new 2014-02-02 00:00:00 new"

【讨论】:

  • 感谢夸奖!请参阅我更新的问题。如果您的答案仍然适用,我应该在哪里/如何将它添加到代码中?
  • 如何确定资历?如果第 1 个人再次开始提供 item5,您从哪里获取日期时间?
  • 会员可以随时登录为他们的列表选择/取消选择服务。对于他们选择的服务,当前日期时间将插入到 db 中他们所在行的每个相应列中。如果他们取消选择服务,则该服务的日期时间将重置为 0000-00-00 00:00:00。他们可以随时进行更改。简而言之,当每个成员更改他们提供的服务时,日期时间会被插入或重置为默认值。
  • 谢谢@Imre L。您的回答符合我最初的要求,因此我接受了您的回答。我用解决方案的链接编辑了我的原始帖子。
【解决方案2】:

尝试将日期转换为时间戳(SQL):

UNIX_TIMESTAMP(DATE)

或php:

date("Y-m-d H:i:s", $unixTimestamp);

然后比较:

mktime(0) - 48*60*60

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 2017-03-23
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多