【问题标题】:implode value does not count as an array内爆值不计为数组
【发布时间】:2018-08-08 11:36:15
【问题描述】:

所以这是我将日期从选定日期设置为自动设置日期的代码,不包括周末(周六和周日)和假期(我将其放入数据库中):

function number_of_working_dates($from, $days) {

  /* get holiday from database */
  include('includes/config.php');
  $sss = "SELECT tanggal_awal FROM libur_nasional GROUP BY tanggal_awal ASC";
  $qqq = mysqli_query($konek,$sss);
  $arr = array();
  while ( $tam = mysqli_fetch_array($qqq)) {
    $date = $tam['tanggal_awal'];
    $reformat_date =  date("Y-m-d", strtotime($date));
    $arr[] = $reformat_date; 
  }
  $array_date_2 = '"'.implode('", "' , $arr) . '"';

implode() 的输出是日期列表:

"2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"

然后继续:

    $holidayDays = [$array_date_2];
    //$holidayDays = ["2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"]
    $from = new DateTime($from);
    $dates = [];
    $dates[] = $from->format('Y-m-d');
    **echo count($holidayDays);**

    while ($days) {
        $from->modify('+1 day');

        if (!in_array($from->format('N'), $workingDays)) continue;
        if (in_array($from->format('Y-m-d'), $holidayDays)) continue;
        if (in_array($from->format('*-m-d'), $holidayDays)) continue;

        $dates[] = $from->format('Y-m-d');
        $days--;
    }
    return $dates;
}

当我使用“count”计算“holidayDays”数组时,它只显示 1 个项目,但是当我像在注释行中那样对日期列表进行硬编码时,它可以工作并显示 4 个项目。

有人可以帮我吗?

【问题讨论】:

  • 我不确定,但是你可以计算一个字符串而不是一个数组吗?
  • 你的问题没有意义。 $holidayDays = [$array_date_2]; 显然是一个包含一个东西的数组,为什么会是其他东西? $holidayDays = "2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17" 抛出异常:解析错误:语法错误,意外','
  • 你的意思是:$holidayDays[] = $array_date_2;
  • 你需要定义 $array_date_2 里面的内容。试试var_dump,看看你得到了什么回报。
  • $holidayDays = [$array_date_2]; 将是一个包含单个项目的数组。该项目是列出所有日期的字符串。所以是的,计数是 1,因为数组包含 1 个字符串。 “内爆”函数产生一个字符串。目前尚不清楚您还期待什么。 php.net/manual/en/function.implode.php 。附言您的硬编码 //$holidayDays = ["2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"] 是一个包含四个 单独 字符串的数组,因此它的计数在逻辑上是 4。Do var_dump($holidayDays);你可以看到变量的结构。

标签: php mysql arrays implode


【解决方案1】:

包含字符串的变量包含该字符串,除非您执行evaluating it as source code 之类的操作(这非常危险),否则它将继续被视为字符串

如果你有:

$foo = ["1", "2", "3"];

然后你有一个包含三个东西的数组。

但如果你有:

$string = '"1", "2", "3"';
$foo = [$string];

然后你有一个数组,里面有一个东西:一个字符串。

和写法一样:

$foo = ['"1", "2", "3"'];

如果你想要一个字符串数组,那么看看你的代码行:

$array_date_2 = '"'.implode('", "' , $arr) . '"';

将字符串数组转换为单个字符串。

不要那样做,因为那不是你想要的。

只需使用您在$arr 中已有的值。

【讨论】:

  • 是的,谢谢你,我明白你的意思了,我从数据库得到的数组列表变成了一个字符串,所以当我计算它时,它显示为 1,那么我应该怎么做才能把这个列表我从数据库中获取的日期格式类似于硬编码日期?
  • @iqbalnahdi — 我请你回到这个答案的最后两句话。
  • 感谢 quentin,我使用了您的解决方案,日期输出为:“2018-08-09”、“2018-08-10”、“2018-08-15”、“2018-08- 17" 这是我想要的,但它仍然算作 1 个数组,如何使它成为 4 个?,对不起,我是新手
  • @iqbalnahdi quentin 的解决方案实际上与我在上面的 cmets 中的解决方案相同 - 即“你可以只使用 $arr”。当您回复我时,您声称这返回了 0 个结果,现在您声称它返回“2018-08-09”、“2018-08-10”、“2018-08-15”、“2018-08-17”、但是您还声称这算作数组中的一项。这些都没有任何意义。您实际上做了什么?您必须做了两件不同的事情。类似于我上面所说的,如果您写了$holidayDays = $arr;,那么唯一它可能包含 0 个项目的原因是您的查询没有返回任何行。不确定您是如何获得其他输出的。
【解决方案2】:

您有一个名为“$array_date_2”的变量,并尝试使用以下代码为其分配一个字符串:

  $array_date_2 = '"'.implode('", "' , $arr) . '"';

这个赋值,在“内爆”执行后,会产生以下结果:

  $array_date_2 = ""2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"";

注意字符串开头和结尾的引号。即使您在“回显”字符串时看不到它们,也将它们包裹在这些引号周围。 PHP 不允许在没有引号的情况下使用字符串,它会抛出解析错误。 所以最后你没有像这样的字符串:

"2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"

但更像

""2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17""

现在您还尝试通过将字符串和特殊字符连接在一起来创建一个数组。这不是 PHP 的工作方式。

如果您想从 String 中“创建”一个函数,或者通常 将 String 评估为 PHP 代码,那么您需要使用 "eval" 但我强烈反对。

仅供参考,如果你使用 eval 你的代码应该是这样的:

eval("\$holidayDays = [".$array_date_2 ."];");

【讨论】:

  • 感谢您的评论,不,不是,$array_date_2 的输出是“2018-08-09”、“2018-08-10”、“2018-08-15”、“2018- 08-17",当我将其编码为 $holidayDays = ["2018-08-09", "2018-08-10", "2018-08-15", "2018-08-17"] 它工作好吧,当我放 $holidayDays = [ $array_date_2 ] 时它不起作用,并且只显示 1 个数组。
  • @iqbalnahdi“不,不是”......对不起,但它是......阅读答案:“即使你在“回声”时看不到它们,字符串被包裹在这些引号周围。 "使用 var_dump 进行演示:sandbox.onlinephpfunctions.com/code/…。我还包括了我们一直在讨论的所有其他变量组合的转储,只是为了说明我们的意思。附言一般来说,var_dump() 在调试方面比 echo 更有用。
  • 我的回答显然不够全面,尽管我特别包含了一个部分,涵盖了您的错误假设,即您的字符串周围没有双引号。正如 ADyson 所说,使用 var_dump 你就会明白我在说什么。不要急于对答案投反对票。花点时间阅读、尝试一下,如果有错误,请提供有用的反馈。
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 2016-10-22
  • 2020-01-26
  • 2019-07-26
  • 2016-02-08
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多