如何以PHP中星期几的二进制表示形式检查当前日期是TRUE还是FALSE

时间:2019-01-19 11:59:32

标签: php dayofweek

我有一个字符串,以“二进制”格式表示星期几。例如:1001110。

在此示例中: 星期一是正确的 星期二,假, 星期三假, 星期四TRUE, 星期五TRUE, 星期六TRUE, 星期天为假

如何以最简单,最优雅的方式确定当日是对还是错。

我已经能够将二进制字符串转换为一周中的几天,然后可以将其与当天进行比较,但是我正在寻找一种更简单的方法(如果可能的话。)

<?php
$arr_jours = array();
$arr_jours = array(
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday'
);
$week = "1001110";
$search_arr = str_split($week);
$out = array();

foreach($search_arr as $key => $value) {
    if ($value == 1) {
        $out[] = $arr_jours[$key];
    }
}

if (in_array(date('l') , $out)) {
    echo "Current day is TRUE";
}
else {
    echo "Current day is FALSE";
}

?>

这可行,但我尝试使其更优雅。如何最好地优化此代码?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

Array_intersect和Implode可以完成这项工作。
首先找到1,然后使用array_intersect_key中的键返回日期,然后将其内爆。

$arr = array(
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday',
    'Sunday'
);
$week = "1001110";
$search_arr = str_split($week);

echo implode(", ", array_intersect_key($arr, array_intersect($search_arr, [1])));
//Monday, Thursday, Friday, Saturday

https://3v4l.org/b936u

如果今天是1,则要获得true / false,请使用in_array。

var_export(in_array(date("l"), array_intersect_key($arr, array_intersect($search_arr, [1]))));
//true because it's Saturday today

https://3v4l.org/7pXpu

答案 1 :(得分:1)

如果您愿意牺牲易读性,则可以使用binary integer literalsbitwise operators

/**
 * @param int $date Unix time
 * @return bool
 */
function isActive($date)
{
    $days = [1 =>
        0b1000000,
        0b0100000,
        0b0010000,
        0b0001000,
        0b0000100,
        0b0000010,
        0b0000001,
    ];
    $week = 0b1001110;
    $day = $days[date('N', $date)];
    return ($week & $day) === $day;
}

Demo

或者您也可以删除二进制文字以使其看起来不那么怪异,而只需使用按位运算符即可:

/**
 * @param int $date Unix time
 * @return bool
 */
function isActive($date)
{
    $days = [1 => 64, 32, 16, 8, 4, 2, 1];
    $week = bindec('1001110');
    $day = $days[date('N', $date)];
    return ($week & $day) === $day;
}