Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可用小时数的PHP数组未标记正确的日期_Php_Arrays - Fatal编程技术网

可用小时数的PHP数组未标记正确的日期

可用小时数的PHP数组未标记正确的日期,php,arrays,Php,Arrays,我正在创建一个简单的系统来显示一个日历,其中包含可用于约会的小时数。为此,我使用了3个信息: 每周几天的列表 可以安排的时间列表 该周已完成的日期/小时列表 然而,当我运行代码时,如果我已经在周一拍了08:00h,那么它会将所有其他日子都标记为已拍 这是我的代码: $list\u hours=数组( (对象)数组( “小时”=>“08:00”, “可用”=>1, ), (对象)数组( “小时”=>“09:00”, “可用”=>1, ), (对象)数组( “小时”=>“10:00”, “可用”

我正在创建一个简单的系统来显示一个日历,其中包含可用于约会的小时数。为此,我使用了3个信息:

  • 每周几天的列表
  • 可以安排的时间列表
  • 该周已完成的日期/小时列表
然而,当我运行代码时,如果我已经在周一拍了08:00h,那么它会将所有其他日子都标记为已拍

这是我的代码:

$list\u hours=数组(
(对象)数组(
“小时”=>“08:00”,
“可用”=>1,
),
(对象)数组(
“小时”=>“09:00”,
“可用”=>1,
),
(对象)数组(
“小时”=>“10:00”,
“可用”=>1,
),
(对象)数组(
“小时”=>“11:00”,
“可用”=>1,
),
(对象)数组(
“小时”=>“12:00”,
“可用”=>1,
),
);
$list\u available=数组(
排列(
“天”=>2天,
“小时”=>“09:00”,
),
排列(
“天”=>4天,
“小时”=>“10:00”,
),
);
$lista_days=数组(
"太阳",,
“周一”,
“星期二”,
“Wed”,
"Thu",,
“星期五”,
"Sat",,
);
$new_list_hours=array();
对于($i=0;$i<7;$i++){
$item=new\StdClass();
$item->name=$lista_天[$i];
$item->hours=$list\u hours;
foreach($list\可用作$avList){
如果((int)$avList['day']==$i){
foreach($item->hours as$ihList){
如果($ihList->hour===$avList['hour']){
$ihList->available=0;
}
}
}
}
数组推送($new\u list\u hours,$item);
未结算(项目);
}
打印时间(新列表时间);
问题是,如果我运行此代码,每周的09:00和10:00将设置为
available:0
,而我只希望在星期二和星期四执行此操作


这是在线测试的代码:

问题的核心在于引用。对象通过引用传递/分配。您在
$list\u hours
中有一个对象数组。稍后将此数组分配给对象属性:
$item->hours=$list\u hours。在此之后,更改循环中的属性(其中
$ihList
是数组中的一个对象):
$ihList->available=0。此时,原始数组
$list\u hours
中的对象已更改,因为您使用的是对该对象的引用,而不是副本。因此,每进一步分配一次
$item->hours=$list\u hours是用那些已经标记为不可用的小时数生成的。@El_Vanja我以为这就是问题所在。但我有两个问题。如果$list_hours以all
available=1开始,并且第一个要检查的日期是2(星期二),为什么星期日和星期一也有
available=0
?第二,如何解决这个问题,有什么想法吗?所有的日子都反映了变化,因为所有的日子都引用完全相同的对象。不管哪一天改变它,他们最终都会看到相同的财产。最简单的修复方法不是预先初始化数组,而是将定义放入赋值中:
$item->hours=[…整个数组…]
。这样,每次迭代都会得到新的实例。@El_Vanja我明白了。问题在于
$list\u hours
(以及
$list\u available
)是一组来自数据库的数据。因此,如果我在循环中分配每次,我每次都需要发出请求。在这种情况下,我可以建议的下一个最简单的修复方法是,使用纯数组完成整个过程,并且只在完成后对对象进行强制转换。