Php 停止向数组中添加重复项
好的,我正在查询数据库并用结果填充数组,但我不想得到重复的结果Php 停止向数组中添加重复项,php,arrays,Php,Arrays,好的,我正在查询数据库并用结果填充数组,但我不想得到重复的结果 $start = date('c', $row['start_time']); while (strtotime($end) < $row['end_time']){ $title = 'Teacher Available'; $color = '#a3a3a3'; $end = date('c', strtotime($start)
$start = date('c', $row['start_time']);
while (strtotime($end) < $row['end_time']){
$title = 'Teacher Available';
$color = '#a3a3a3';
$end = date('c', strtotime($start) + hoursToSeconds($row_Branch['session']));
$allday = ($row['allDay'] == "1") ? true : false;
if (in_array($start, $input_arrays) == false){
$input_arrays[]= array(title => $title, start => $start, end => $end, color => $color, allDay => $allday);
}
$start = date('c', strtotime($end));
}
$start=date('c',$row['start\u time']);
while(strotime($end)<$row['end\u time']){
$title=‘教师可用’;
$color='#a3a3';
$end=date('c',strottime($start)+hoursToSeconds($row_分支['session']);
$allday=($row['allday']=“1”)?true:false;
if(在数组中($start,$input\u数组)==false){
$input_arrays[]=array(title=>$title,start=>$start,end=>$end,color=>$color,allDay=>$allDay);
}
$start=date('c',strottime($end));
}
在我看来,如果已经有一个条目具有相同的$start,那么这不应该向数组中添加新条目,但出于某种原因,它还是会添加它
有人知道我哪里出错了吗?
设置为日期('c',…
)返回的字符串$input_array
是一个数组,其中每个元素也是一个数组
因此,当您在_array($start,$input_array,true)中测试时,它将测试您的字符串是否等于$input_array
数组中的每个数组。字符串总是不等于数组,特别是因为您指定了true
,这意味着类型必须匹配
有很多方法可以解决这个问题,这取决于你想要什么,包括
...
if ( !array_key_exists($start, $input_arrays) ){
$input_arrays[$start]= array(title => $title, start => $start, end => $end, color => $color, allDay => $allday);
}
...
编辑:使用0,1,2键获取$input_数组
,。。。根据日历模块的要求,在while
循环之后添加此语句:
$input_arrays = array_values($input_arrays);
$start
设置为日期('c',…
)返回的字符串$input_array
是一个数组,其中每个元素也是一个数组。非空字符串始终不等于非空数组,因此数组中的始终返回false。试试这个
$start = date('c', $row['start_time']);
$startTimesAlreadyAdded = [];
while (strtotime($end) < $row['end_time']){
$title = 'Teacher Available';
$color = '#a3a3a3';
$end = date('c', strtotime($start) + hoursToSeconds($row_Branch['session']));
$allday = ($row['allDay'] == "1") ? true : false;
if ( !in_array($start, $startTimesAlreadyAdded) ) {
$input_arrays[] = array(title => $title, start => $start, end => $end, color => $color, allDay => $allday);
$startTimesAlreadyAdded[] = $start;
}
$start = date('c', strtotime($end));
}
$start=date('c',$row['start\u time']);
$startTimesAlreadyAdded=[];
while(strotime($end)<$row['end\u time']){
$title=‘教师可用’;
$color='#a3a3';
$end=date('c',strottime($start)+hoursToSeconds($row_分支['session']);
$allday=($row['allday']=“1”)?true:false;
如果(!in_数组($start,$startTimesAlreadyAdded)){
$input_arrays[]=array(title=>$title,start=>$start,end=>$end,color=>$color,allDay=>$allDay);
$startTimesAlreadyAdded[]=$start;
}
$start=date('c',strottime($end));
}
这将给您留下带有键0,1,2,。。。根据日历模块的要求。如果添加查询字符串,将非常有用。然后使用group by
求解,在搜索变量后分配变量,这使它查找while循环最后一次迭代中设置的变量,而不是当前迭代中设置的变量。group by不起作用,因为数据库中的起始值和结束值可能不相等。但我不希望在重叠的地方出现双重重叠。@Qirel这完全正确,每次循环$start时都应与最后一个$end相同。无论是否使用严格检查,我都会得到相同的结果。编辑以删除严格检查,只是为了向其他人澄清。我不是在寻找数组键,而是在寻找数组中具有相同“start”的其他条目。Aaron,最简单的解决方案(甚至可能是唯一的解决方案)是将$start指定为数组键,然后允许简单的array\u key\u存在
检查。尽量不要使不复杂的任务过于复杂。@Aaron,错误不在于严格的检查。正如您所说,无论是否经过严格检查,它都会失败。问题是“in_array”并不像你想象的那么聪明。它只传递$start的值,它不知道该值应该与名称“start”关联,因此应该在$input\u数组中的数组中查找名为“start”的键。它更简单、更通用,因此比这更普遍有用。我建议的关键(双关语!)更改是使用$start作为$input\u数组的键,以便您可以在每次迭代中测试重复项。@Aaron。见下面的答案;它向原始代码中添加了2条语句。或者,您可以通过在while循环之后添加“$input\u arrays=array\u values($input\u arrays);”来修复上述问题。它将返回一个具有相同值但键为0,1,2,。。。根据日历模块的要求。