我有一个二维数组,如下所示:
array( array(), array(), array(), array(), array(), array() );
我必须在一天 8 小时的时间段中访问0,1,2 个索引数组,如果用户请求值与第一个 8 小时时间段中的数组值匹配,那么他将获得第 3 个索引数组,否则为第 0 个索引数组,如果相同的用户请求在接下来的第 8 小时时隙再次,然后他将获得第 4 个索引数组。如果有新请求与数组中的值不匹配,那么他们会得到预定的索引数组,即
从上午 12:00 到上午 8:00,他们得到 Array( 0 => array() ),
从上午 8:00 到下午 16:00,他们得到 Array(1 => array()),
从下午 16:00 到 23:59,他们得到 Array(2 => array())。
我已经使用 if else 条件实现了这一点,但使用了硬线时序条件:
$params = array(); //main array
$pn = $_REQUEST['pn'];
$ad = new time_slot();
$time = date("H");
if ( $pn == $ad->ad_filter( $params, 0 ) ) { //ad_filter extract value from array and match request user value
if ( $time < 8 ) {
echo $ad->ad_data( $params, 1 ); //ad_data throw an array from multi-dimensional array
} else {
echo $ad->ad_data( $params, 3 );
}
} elseif ( $pn == $ad->ad_filter( $params, 1 ) ) {
if ( $time > 8 && $time < 16 ) {
echo $ad->ad_data( $params, 2 ); //after 8 hour
} else {
echo $ad->ad_data( $params, 4 );
}
} elseif ( $pn == $ad->ad_filter( $params, 2 ) ) {
if ( $time > 16 && $time < 24 ) {
echo $ad->ad_data( $params, 0 ); //after 16 hour
} else {
echo $ad->ad_data( $params, 5 );
}
} elseif ( !in_array($pn, $ad->ad_filter( $params ))) { //if request is new
if ( $time < 8 ) {
echo $ad->ad_data( $params, 0 );
} elseif ( $time > 8 && $time < 16 ) {
echo $ad->ad_data( $params, 1 );
} elseif ( $time > 16 && $time < 24 ) {
echo $ad->ad_data( $params, 2 );
} else {
echo $ad->ad_data( $params, 3 );
}
}
但是,如果必须在两个槽中抛出数组,即在 12 小时槽中或如果在 4 小时槽中,那么我必须再次编码条件,这对我来说是可悲的。所以我为这个场景创建了一个函数包装器:
使用 sizeof 计算数组并在所有迭代中循环它:
function array_scheduling( $params = array() ) {
for ($i=0; $i<sizeof($params)/2; $i++) {
if ($pn == $ad->ad_filter($params, $i)) {
if ($time < (24/(sizeof($params)/2))*($i+1)) {
echo $ad->ad_data( $params, $i++ );
} else {
echo $ad->ad_data( $params, $i+=3 );
}
} elseif (!in_array($pn, $params)) {
echo $ad->ad_data( $params, $i );
}
}
}
这只是一次尝试,但它有点不起作用,因为如果用户请求值与最后一个数组元素值匹配,那么我必须抛出第一个数组。我可以使用if/else
条件成功地做到这一点,但将来如果有更多插槽,那么我如何使用包含抽象定义的函数来实现它。