分类 php 下的文章

PHP中提供了以下几种位级操作符(也称为位运算符):

位与运算符 (&): 对两个数的每一位进行逻辑与操作。如果两个对应位都为1,则结果位为1;否则结果位为0。

位异或运算符 (^): 对两个数的每一位进行逻辑异或操作。如果两个对应位不同(一个为0,另一个为1),则结果位为1;若两者相同(同为0或同为1),则结果位为0。

位取反运算符 (~): 对一个数的所有位进行逻辑取反(翻转)。将每一位从0变为1,或从1变为0。

左移运算符 (<<): 将一个数的二进制表示向左移动指定的位数。高位被移出的部分丢弃,低位空出的位置补0。

右移运算符 (>>): 将一个数的二进制表示向右移动指定的位数。对于有符号整数,通常有两种模式:

算术右移 (>>): 高位空出的位置根据原数的符号(正负)填充相同的值(正数填0,负数填1)。
无符号右移 (>>>): PHP不直接支持无符号右移,但可通过先将其转换为无符号类型再进行常规右移来模拟此效果。
按位与赋值运算符 (&=): 对一个数与另一个数进行位与运算,并将结果赋值回第一个数。

按位或赋值运算符 (|=): 对一个数与另一个数进行位或运算,并将结果赋值回第一个数。

按位异或赋值运算符 (^=): 对一个数与另一个数进行位异或运算,并将结果赋值回第一个数。

左移赋值运算符 (<<=): 将一个数向左移动指定的位数,并将结果赋值回该数。

右移赋值运算符 (>>=): 将一个数向右移动指定的位数,并将结果赋值回该数。

这些位级操作符常用于低层编程、硬件接口通信、数据压缩、加密算法、快速计算特定数学关系以及其他需要直接操作二进制位的场景。在适当的情况下使用位运算可以提高代码的运行效率,因为它们通常比常规算术运算更快,并且可以直接在CPU级别完成。

以下是使用PHP编写针对上述10种位级操作符的代码实例:

位与运算符 (&):

php
$a = 0b1010; // 10 (二进制)
$b = 0b1100; // 12 (二进制)

$result = $a & $b; // 结果: 0b1000 = 8 (二进制)
echo $result; // 输出: 8

位异或运算符 (^):

php
$a = 0b1010; // 10 (二进制)
$b = 0b1100; // 12 (二进制)

$result = $a ^ $b; // 结果: 0b0110 = 6 (二进制)
echo $result; // 输出: 6

位取反运算符 (~):

php
$a = 0b1010; // 10 (二进制)

$result = ~$a; // 结果: 0b0101 = -11 (二进制,考虑到PHP的有符号整数表示)
echo $result; // 输出: -11

左移运算符 (<<):

php
$a = 0b1010; // 10 (二进制)

$result = $a << 2; // 结果: 0b101000 = 40 (二进制)
echo $result; // 输出: 40

右移运算符 (>>):

php
$a = 0b101000; // 40 (二进制)

$result = $a >> 2; // 结果: 0b1010 = 10 (二进制)
echo $result; // 输出: 10

按位与赋值运算符 (&=):

php
$a = 0b1010; // 10 (二进制)
$b = 0b1100; // 12 (二进制)

$a &= $b; // 相当于 $a = $a & $b;

echo $a; // 输出: 8 (已更新为位与运算的结果)

按位或赋值运算符 (|=):

php
$a = 0b1010; // 10 (二进制)
$b = 0b1100; // 12 (二进制)

$a |= $b; // 相当于 $a = $a | $b;

echo $a; // 输出: 14 (已更新为位或运算的结果)

按位异或赋值运算符 (^=):

php
$a = 0b1010; // 10 (二进制)
$b = 0b1100; // 12 (二进制)

$a ^= $b; // 相当于 $a = $a ^ $b;

echo $a; // 输出: 6 (已更新为位异或运算的结果)

左移赋值运算符 (<<=):

php
$a = 0b1010; // 10 (二进制)

$a <<= 2; // 相当于 $a = $a << 2;

echo $a; // 输出: 40 (已更新为左移运算的结果)

右移赋值运算符 (>>=):

php
$a = 0b101000; // 40 (二进制)

$a >>= 2; // 相当于 $a = $a >> 2;

echo $a; // 输出: 10 (已更新为右移运算的结果)

这些代码示例展示了如何使用各个位级操作符以及对应的赋值运算符,并输出了运算结果。注意,实际应用中可能需要根据具体需求调整变量值和位移量。

如果你想同时结束两个嵌套的foreach循环,单纯使用break语句是无法实现的,因为break只能中断所在的一层循环。但是你可以通过设置一个布尔标志变量来控制是否继续执行外部的循环,如下所示:

php
$flagContinue = true;
$arr1 = array('item1', 'item2');
$arr2 = array('subitem1', 'subitem2');

foreach ($arr1 as $item1) {

foreach ($arr2 as $item2) {
    // 假设这里的某个条件满足时,我们希望同时结束两个循环
    if (someConditionMet()) {
        $flagContinue = false;
        break 2; // 这里虽然不能直接跳出两个循环,但能跳出内部循环
    }
    
    // 其他处理代码
}

// 如果已经设置了$flagContinue为false,则不再进入下一轮外部循环
if (!$flagContinue) {
    break;
}

// 处理外部循环相关代码

}

function someConditionMet() {

// 返回一个布尔值,表示是否满足提前结束两个循环的条件

}

在这个示例中,当someConditionMet()函数返回true时,我们会将$flagContinue设置为false并跳出内部的foreach循环。然后在外部循环的末尾检查$flagContinue的值,若为false则跳出外部循环。这样就实现了同时结束两个嵌套循环的效果。不过请注意,这里实际上还是分别结束了两次循环,而非真正意义上的同时结束。在PHP中并没有直接一次性跳出多层循环的语法。

    ob_clean();
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment; filename="' . basename($path) . '"');

// header('Content-Disposition: inline; filename="file.pdf"');

    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    readfile($path);
    exit;

字符 含义 示例
表示日期
d 一个月中的第几天,补零 01到31
D 星期几,缩写 Mon到Sun
j 一个月中的第几天,不补零 1到31
l
(小写的’L’) 星期几,全称 Sunday到Saturday
N ISO-8601标准下,一周中的第几天 1(星期一)到7(星期天)
S 日期的序号后缀,两个字母 st,nd,rd 或th
w 一周中的第几天 0(星期天)到6(星期六)
z 一年中的第几天 0到365
表示周
W ISO-8601标准下(以周一为一周的开始),一年中的第几周 42(一年中的第42周)
表示月
F 月份,全称 January到December
m 月份,两位数字,补零 01到12
M 月份,简称,三个字母 Jan到Dec
n 月份,数字,不补零 1到12
t 一个月中的第几天 28到31
表示年
L 是否为闰年 1(闰年)0(非闰年)
o ISO-8601标准下年份,四位数字(同Y,如果W属于前一年或后一年则使用这个符号) 1999或2003
Y 年份,四位数字 1999或2003
y 年份,两位数字 99或03
表时间
a 小写的am和pm am或pm
A 大写的AM和PM AM或PM
B 国际网络时(Swatch Internet Time) 000到999
g 12小时制,小时,不补零 1到12
G 24小时制,小时,不补零 0到23
h 12小时制,小时,补零 01到12
H 24小时制,小时,补零 00到23
i 分钟,补零 00到59
s 秒,补零 00到59
u 微秒 654321
v 毫秒 654
表时区
e 时区标识符 UTC,GMT,Atlantic/Arozes
I
(大写的i) 是否为夏令时 1(夏令时)0(非夏令时)
O 与格林威治时间 (GMT) 的小时和分钟之间的差值,无冒号 +02 00
P 与格林威治时间 (GMT) 的小时和分钟之间的差值,有冒号 +02:00
T 时区缩写 EST,MDT
Z 时区偏移量(以秒为单位)。UTC 以西时区的偏移量始终为负数,而 UTC 以东的时区的偏移量始终为正值。 -43200到50400
标准格式
c ISO 8601 格式日期 2004-02-12T15:19:21+00:00
r RFC 2822 格式日期 Thu, 21 Dec 2000 16:01:07 +0200
U 自Unix时间戳(January 1 1970 00:00:00 GMT)以来的秒数