Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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,好的,我正在查询数据库并用结果填充数组,但我不想得到重复的结果 $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,。。。根据日历模块的要求。