内爆值不算作数组

时间:2018-08-08 11:36:16

标签: php mysql arrays implode

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

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个项目。

有人可以帮我吗?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

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

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

执行“内爆”后,此分配将导致以下结果:

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

请注意字符串开头和结尾的引号。即使您在“回显”字符串时没有看到它们,字符串也被这些引号引起来。 PHP不允许在没有用引号引起来的情况下使用String,否则将引发Parse Error。 所以最后您没有像这样的字符串:

"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的工作方式。

如果您想从字符串中“创建”函数,或者通常将字符串评估为PHP代码,则需要使用“ eval ”,但我强烈建议反对。

仅供参考,如果您使用 eval ,则代码应如下所示:

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