我有一个二维数组如下:
array( array(), array(), array(), array(), array(), array() );
我必须在白天8小时的时段中访问 0,1,2索引数组,如果用户请求值与第8个小时插槽中的数组值相匹配,那么他将获得第3个索引否则为第0个索引数组的数组,如果在接下来的第8个小时槽中再次发出相同的用户请求,那么他将获得第4个索引数组。如果有新的请求与数组中的值不匹配,那么它们就会得到预定的索引数组,即
从12:00 A.M到8:00Am他们得到Array(0 => array()),
从早上8点到下午16点,他们获得了Array(1 => array()),
从16:00Pm 23:59 PM得到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
条件,但是将来如果有更多的插槽,那么我怎样才能使用包含抽象定义的函数来实现它。