使用另一个函数

时间:2017-08-06 18:03:40

标签: javascript php jquery arrays

我知道有很多关于这个主题的帖子,但我无法使用其中任何一个来满足我的需求。目的是在datepicker中使用变量 seconddivval 并显示可用日期。

我有一个带有隐藏输入的PHP foreach循环

<td class='myArray'>
<input type="hidden" class="activedates" value="<?php echo "['".implode("','",$newactivedate)."'];"; ?>">

单击myArray时,此Javascript函数返回上述输入的值

$('.myArray').click(function() {
    seconddivval = $(this).find('input.activedates').val();
});

以上所有工作都很好,但我需要在此函数中使用变量 seconddivval

function available(date) {

  dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
date.getFullYear();
  if ($.inArray(dmy, seconddivval) != -1) {
return [true, ""];
   } else {
return [false,""];
  }
}

$(".datefromavailable").datepicker({
    minDate: 0,
    dateFormat: 'M dd, yy',
    changeMonth: true,
    changeYear: true,
    numberOfMonths: 2,
    beforeShowDay: available,
    onClose: function (selectedDate) {

        $(".datetoavailable").datepicker("option", "minDate", selectedDate);
        var days_to_add = 365, // SET DAYS HERE
        parsed_date = new Date($.datepicker.parseDate('M dd, yy', selectedDate)),
        add_year = new Date(parsed_date.setDate(parsed_date.getDate() + days_to_add)),
        formatted_date = $.datepicker.formatDate('M dd, yy', add_year);

        $(".datetoavailable").datepicker('option', 'maxDate', formatted_date);
        $(this).parent().next().children().focus();
        setTimeout(function() {
            $(this).next().datepicker('show')
        },0);
    }
});

$(".datetoavailable").datepicker({
    minDate: 0,
    dateFormat: 'M dd, yy',
    changeMonth: true,
    changeYear: true,
    numberOfMonths: 2,
    beforeShowDay: available,
    maxDate: '+1y'
});
});

我确信它很简单,但我无法找到实现目标的方法。

我尝试了所有我能想到的东西。我在函数外部声明了变量,我删除了var,我将 window.seconddivval; 添加到click函数中,我在函数末尾添加了return,...

我甚至试过以下,我认为这是正确的方法。如果我只有一个数组但是如果我有多个数组,那么它只能返回第一个数组:

var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;

这个foreach循环也有效,但也返回第一个数组:

var seconddivval = new Array();
<?php foreach($newactivedate as $key => $val){ ?>
    seconddivval.push('<?php echo $val; ?>');
<?php } ?>

我做错了什么?

<小时/> 的修改
以下是$newactivedate的形成方式:

$sqlactivedate = $bddp->prepare("SELECT (nullif(Adate1,'')),(nullif(Adate2,'')),(nullif(Adate3,'')),‌​(nullif(Adate4,'')),‌​(nullif(Adate5,'')),‌​(nullif(Adate6,'')),‌​(nullif(Adate7,'')),‌​(nullif(Adate8,'')),‌​(nullif(Adate9,'')),‌​(nullif(Adate10,'')) 
FROM prices WHERE id_prices = '$id_prices'");

$sqlactivedate->execute();
$rowactivedate = array();

while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) {
  $newactivedate = array();
  $newactivedate = array_filter($rowactivedate); 

这些是从数据库中提取的2行:

Room1 → {"(nullif(Adate1,''))":"15-8-2017","(nullif(Adate2,''))":"16-8-2017","(nullif(Adate3,''))":"17-8-2017","(nullif(Adate4,''))":"18-8-2017","(nullif(Adate5,''))":"20-8-2017","(nullif(Adate6,''))":"21-8-2017","(nullif(Adate7,''))":"22-8-2017","(nullif(Adate8,''))":"25-8-2017","(nullif(Adate9,''))":"26-8-2017","(nullif(Adate10,''))":"28-8-2017"}

Room2 → {"(nullif(Adate1,''))":"1-8-2017","(nullif(Adate2,''))":"2-8-2017","(nullif(Adate3,''))":"4-8-2017","(nullif(Adate4,''))":"5-8-2017","(nullif(Adate5,''))":"28-8-2017","(nullif(Adate6,''))":"29-8-2017","(nullif(Adate7,''))":"4-9-2017","(nullif(Adate8,''))":"5-9-2017","(nullif(Adate9,''))":"6-9-2017","(nullif(Adate10,''))":"7-9-2017"}

3 个答案:

答案 0 :(得分:0)

在:

if ($.inArray(dmy, seconddivval) != -1) {

您正在查看数组中是否存在值...
seconddivval 不是数组。

这是一个像"['2017-07-04','2017-07-05','2017-07-06']"

这样的字符串

你必须把它变成一个数组 所以从你在文本输入中的格式...它将是:

var seconddivval_asArray = seconddivval.substr(1,seconddivval.length-2).replace(/'/g,"").split(",");

CodePen

直接在JS变量中对echo数组 ...而不是在文本输入中回显...

<小时/> 的修改

好的......我们将从您的PHP开始。

应在$newactivedate循环之前定义

while 我们将把数据推送到内部......并避免完全覆盖它。

$newactivedate = [];
while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) {

  array_push($newactivedate, array_filter($rowactivedate));
  //...
}

现在你有一个包含数组的数组...
我们将其“字符串化”,以便能够直接在JS变量中回显它。

$newactivedate_string = json_encode($newactivedate);

然后在JS变量中回显:

var seconddivval = <?php echo $newactivedate_string; ?>;

现在,您在JS中拥有与PHP相同的“数组数组” 所以available(date)函数应该稍微修改一下......以查看每个“内部数组”。

function available(date) {

  dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
  date.getFullYear();

  for(i=0;i<seconddivval.length;i++){

    if ($.inArray(dmy, seconddivval[i]) != -1) {
      return [true, ""];
     } else {
      return [false,""];
    }
  }
}

<小时/> 并且在函数之外声明变量是要走的路 )

答案 1 :(得分:0)

您可以使用echo JSON别名php json_encode().ready()来自$()的有效$.getJSON()字符串,并获得{{1}的响应}}

$(function() {
  var seconddivval;
  $.getJSON("/path/to/server")
  .then(function(json) {
    seconddivval = json; // global though we will use the variable with `.then()`
    $(".myArray.input.activedates").data()
    function available(date) {
      dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' + 
      date.getFullYear();
      if ($.inArray(dmy, seconddivval) != -1) {
        return [true, ""];
      } else {
        return [false,""];
      }
    }
    $(".datefromavailable").datepicker(
      {minDate: 0, dateFormat: 'M dd, yy', changeMonth: true
      , changeYear: true, numberOfMonths: 2, beforeShowDay: available
    }); 
      }, function err(jqxhr, textStatus, errorThrown) {
       console.error(errorThrown)
  })
})

答案 2 :(得分:0)

我认为我发现了自己的错误,我在这里发帖,因为它可以帮助别人:

1.-在函数可用(日期)中声明 seconddivval

var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;

奇怪的是,如果在外面声明,它只返回最后一行数组。

2.-我删除了** $(文件).ready(function()**

3.-我应该在PHP while循环结束之前编写JS脚本。这样它需要正确的行(我错误地认为使用点击功能更容易......但是犯错是我们学习的方式......)。

感谢所有帮助我解决此问题的人!