如何在 PHP 中的星期几的二进制表示中检查当前日期是 TRUE 还是 FALSE
How to check if the current day is TRUE or FALSE in a binary representation of the days of the week in PHP
我有一个以 "binary" 格式表示星期几的字符串。示例:1001110.
在这个例子中:
星期一是真的,
星期二,假的,
周三假,
星期四 真,
周五真,
星期六真,
周日假
如何以最简单优雅的方式判断当天是真还是假。
我已经能够将二进制字符串转换为星期几,然后我可以将它与当前日期进行比较,但我正在寻找一种更轻便的方法,(如果可能的话..)
<?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";
}
?>
这行得通,但我试图让它更优雅。我怎样才能最好地优化这段代码?
感谢您的帮助。
Array_intersect 内爆可以完成这项工作。
首先找到 1,然后使用 array_intersect_key 到 return 天中的密钥,然后将其内爆。
$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
要获得 true/false 如果今天是 1 则使用 in_array。
var_export(in_array(date("l"), array_intersect_key($arr, array_intersect($search_arr, [1]))));
//true because it's Saturday today
如果您愿意牺牲易读性,您可以使用 binary integer literals and bitwise 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;
}
我有一个以 "binary" 格式表示星期几的字符串。示例:1001110.
在这个例子中: 星期一是真的, 星期二,假的, 周三假, 星期四 真, 周五真, 星期六真, 周日假
如何以最简单优雅的方式判断当天是真还是假。
我已经能够将二进制字符串转换为星期几,然后我可以将它与当前日期进行比较,但我正在寻找一种更轻便的方法,(如果可能的话..)
<?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";
}
?>
这行得通,但我试图让它更优雅。我怎样才能最好地优化这段代码?
感谢您的帮助。
Array_intersect 内爆可以完成这项工作。
首先找到 1,然后使用 array_intersect_key 到 return 天中的密钥,然后将其内爆。
$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
要获得 true/false 如果今天是 1 则使用 in_array。
var_export(in_array(date("l"), array_intersect_key($arr, array_intersect($search_arr, [1]))));
//true because it's Saturday today
如果您愿意牺牲易读性,您可以使用 binary integer literals and bitwise 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;
}