php 位运算符

 更新时间:2016年11月25日 15:51  点击:1844

位运算符

 位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。

 在 32 位系统上不要右移超过 32 位。不要在结果可能超过 32 位的情况下左移。

  例子                  名称                               结果
 $a & $b     And(按位与)    将把 $a 和 $b 中都为 1 的位设为 1。
 $a | $b      Or(按位或)      将把 $a 或者 $b 中为 1 的位设为 1。
 $a ^ $b     Xor(按位异或)    将把 $a 和 $b 中不同的位设为 1。
 ~ $a      Not(按位非)    将 $a 中为 0 的位设为 1,反之亦然。
 $a << $b   Shift left(左移)    将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
 $a >> $b   Shift right(右移)    将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

<?php教程

$a=1; 
$b=1;
echo "<br/>And(按位与)";    //将把 $a 和 $b 中都为 1 的位设为 1
echo $a&$b;      //显示值  1

echo "<br/>Or(按位或)";    //将把 $a 或者 $b 中为 1 的位设为 1
echo $a|$b;      //显示值  1

echo "<br/> Xor(按位异或)";//将把 $a 和 $b 中不同的位设为 1
echo $a^$b;      //显示值  0

echo "<br/>Not(按位非)";    //将 $a 中为 0 的位设为 1,反之亦然
echo ~$a;      //显示值  -2

echo "<br>Shift left(左移)";//将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)
echo $a<<$b;      //显示值  2

echo "<br/>Shift right(右移)";//将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。
echo $a>>$b;       //显示值 0

?>

位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值。


<?php
echo 12 ^ 9; // 输出为 '5'

echo "12" ^ "9"; // 输出退格字符(ascii 8)
                    // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

echo "hallo" ^ "hello"; // 输出 ascii 值 #0 #4 #0 #0 #0
                            // 'a' ^ 'e' = #4

echo 2 ^ "3"; // 输出 1
              // 2 ^ ((int)"3") == 1

echo "2" ^ 3; // 输出 1
              // ((int)"2") ^ 3 == 1                           
?>

今天使用POST方式(GET方式也要注意)向PHP提交了一个JSON数据,比如:

{"a":1,"b":2}

在PHP中取出这个数据:

$s=$_POST['data'] ;//or $_GET['data']

然后这个串取出后是被转义的:

 {"a":1,"b":2}

如果直接调用:

$obj = json_decode($s); 

print_r($obj); 
echo $obj->a;
 是错误的,会报告错误.

如果$s直接定义:

$s='{"a":1,"b":2}';

则没有问题.

所以在PHP中处理JSON时需要进行一下转义处理:

$s=strips教程lashes($_POST['data']) ;

这样再进行json解码就可以了.


json_decode — 对 JSON 格式的字符串进行编码
json_encode — 对变量进行 JSON 编码

Report a bug 说明
string json_encode ( mixed $value )
返回 value 值的 JSON 形式

Report a bug 参数

value
待编码的 value ,除了resource 类型之外,可以为任何数据类型

该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)


Report a bug 返回值
编码成功则返回一个以 JSON 形式表示的 string 。

Report a bug 范例

Example #1 A json_encode() 的例子

<?php教程
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

echo json_encode($arr);
?>
以上例程会输出:

{"a":1,"b":2,"c":3,"d":4,"e":5}

 

json_encode — 对变量进行 JSON 编码

json_decode — 对 JSON 格式的字符串进行编码

Report a bug 说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 JSON 格式的字符串并且把它转换为 PHP 变量

Report a bug 参数

json
待解码的 json string 格式的字符串。

assoc
当该参数为 TRUE 时,将返回 array 而非 object 。


Report a bug 返回值
Returns an object or if the optional assoc parameter is TRUE, an associative array is instead returned.

Report a bug 范例

Example #1 json_decode() 的例子

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

var_dump(json_decode($json));
var_dump(json_decode($json, true));

?>
以上例程会输出:

object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

 

PHP Session 变量

<?php教程
    session_start ();
    $music = "A";
    session_register ('music');

    echo $music;
?>
    

当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态。

通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库教程中。

Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
开始 PHP Session
在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

注释:session_start() 函数必须位于 <html> 标签之前:

<?php session_start(); ?>

<html>
<body>

</body>
</html>上面的代码会向服务器注册用户的会话,以便您可以开始保存用户信息,同时会为用户会话分配一个 UID。
存储 Session 变量
存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量:

<?php
session_start();
// store session data
$_SESSION['views']=1;
?>

<html>
<body>

<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>

</body>


</html>输出:

Pageviews=1在下面的例子中,我们创建了一个简单的 page-view 计数器。isset() 函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,我们累加计数器。如果 "views" 不存在,则我们创建 "views" 变量,并把它设置为 1:

<?php
session_start();

if(isset($_SESSION['views']))
  $_SESSION['views']=$_SESSION['views']+1;

else
  $_SESSION['views']=1;
echo "Views=". $_SESSION['views'];


php session_start()关于Cannot send session cache limiter - headers
解决办法:
修改php.ini中的session.auto_start = 0 为 session.auto_start = 1
output_buffering =改为on或者任何数字。
然后别忘记重新启动...


错误提示
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
分析及解决办法
这一类问题,的原因是你在程序中使用PHP session_start()时,之前已经有实际的html内容输出了。或许你说,我没有啊,我只不过是echo或print一条消息了。很抱歉,你的echo或print语句所产生的输出,就是实际的html内容输出。解决此类问题的办法是,将你的session_start()调到程序的第一行。


Warning: Trying to destroy uninitialized session in
分析及解决方法
出类这样的提示,一般情况都是你直接调session_destroy()函数造成的。很多的朋友认为session_destroy()函数可以独立的运行,其实不然。解决的方法是在你调session_destroy()函数之前,要用PHP session_start()开启session的功能。

zend studio 5.5中文乱码解决方法


购买zend产品的用户太少了还是我安装的问题,装好后桌面选项中竟然没有“简体中文”的语言选项了,到配置文件夹里看了一会,在系统盘中搜索XML文件desktop_options.xml(例如:C:Documents and SettingsAdministratorZDEconfig_5.5 目录下的 desktop_options.xml)

<customized_property ID="desktop.language">
  <locale language="en" country="" variant=""/>
</customized_property>
将en改为zh,重启zend后就可以了。(不过不能进首选项去设置,不然你又要重复一次上面的操作了。因为首选项里只有英文给你选)
中文乱码的解决方法
从系统盘下windows/fonts中把所有的字体复制到
zend studio 5.5 安装目录下的,如D:Program FilesZendZendStudio-5.5.0jrelibfonts
的目录下,重启ZEND就可以了!

 

Zend Studio 中文字体显示彻底解决 & JAVA 环境下的中文乱码解决
这种解决方法应该不仅仅用于解决Zend studio的问题,也能够解决几乎所有给予java的编辑器字体问题,具体原理我就不细说了,大家应该很容易明白。
具体步骤:

    1、 找到jre_path/lib/目录,注意zend studio的jre目录一般在”c:program fileszendzendstudio-5.X.0jrelib”,而系统的jre目录一般在”c:program filesjavajre1.Xlib”。
2、除fontconfig.properties.src文件保留外,删除所有以fontconfig.开头的文件
3、复制fontconfig.properties.src文件为fontconfig.properties
4、在文件的末尾添加上,下面四行

         dialoginput.plain.alphabetic=Consolas
       dialoginput.bold.alphabetic=Consolas Bold
       dialoginput.italic.alphabetic=Consolas Italic
       dialoginput.bolditalic.alphabetic=Consolas Bold Italic
    5、在编辑器(zend studio)中指定字体位”dialoginput”,重启编辑器
6、注意:第4步的中“Consolas、Consolas Bold..“部分即为你选择的字体名称。以后如果希望更改字体,就要在这里改,然后重启编辑器即可生效。


win7下zend studio5.5中文乱码解决方法
1、打开 C:Documents and SettingsAdministratorZDEconfig_5.5desktop_options.xml(这个地址要根据自己的电脑而定。)
2、查找 editing.encoding
3、修改里面为 <encoding name=”UTF-8″/>
4、保存,并将该文件属性设置为只读,否则zend每次启动都会将 desktop_options.xml 初始化
5、重启 zend
注意,你现在打开 zend 有可能以前打开的utf-8文件还是乱码,没事,你只需要关掉该文件再重新打开即可

先给出一条结论,然后我们在用代码来证明这个结论吧。$arrtmp=$arr;在这个赋值表达式中我把$arr叫做赋值数组,把$arrtmp叫做被赋值数组。数 组在赋值时,如果赋值数组的数组指针已经指向了数组末尾,则赋值之后赋值数组的数组指针会被重置,指向数组第一个元素;如果在赋值时,赋值数组的数组指针 没有指向数组末尾,而是指向了任何一个有效的数组元素,那么在赋值之后赋值数组的数组指针是不会被重置的,而是保留其原来指向的元素。在赋值之后,被赋值 数组不仅有了赋值数组的值,而且赋值数组的数组指针指向了那个元素,被赋值的数组也会指向自己中值相同的那个元素。
demo1:

<?php教程
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
    if($value == 4) break;
}
var_dump(current($arr));

$arr1 = $arr;

var_dump(current($arr));
var_dump(current($arr1));
?>


demo1 的执行结果是:int(5) int(5) int(5) 。从这个结果可以看出,赋值前后$arr的数组指针位置没有发生任何变化,$arr1不仅值跟$arr相同,而且数组指针所指向的元素值也是相同的。现在 用上述结论来解释这个结果,在while循环中,有一个if判断语句,目的是不让$arr的数组指针指向数组末尾,而是保留在一个有效的位置。 在$value=4时会跳出循环,而each这个函数会将数组指针向前移动一位,这就导致了$arr的数组指针指向了第5个元素,所以在赋值之 前,current($arr)的结果是5,赋值之后,由于在赋值之前$arr的当前指针并没有指向末尾,因此在赋值之后不会将$arr的数组指针进行重 置,而是保留了其原有的位置,因此在赋值之后使用current($arr)的结果仍然是5。赋值时$arr1不仅获得了$arr的值,而且数组指针指向 的元素和$arr的相同,二者都是5。
demo2:

<?php
$arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
while( list($key,$value) = each($arr) )
{
    //if($value == 4) break;
}
var_dump(current($arr));

$arr1 = $arr;

var_dump(current($arr));
var_dump(current($arr1));
?>


demo2中我们将 if($value == 4) break; 这一句注释掉了,目的很简单,就是通过each将$arr的数组指针位置指向数组末尾。
demo2 的执行结果:bool(false) int(1) bool(false) 。如果数组指针对应的元素为0,“”,或者不是一个有效的值时,current函数会返回false,$arr的值中没有为0或者“”的情况,因此可以断 定是因为数组指针指向了一个无效的元素而导致current返回了一个false。换句话说就是可以确定在while循环完成之后,$arr的数组指针已 经指向了数组的末尾。所以我们看到在赋值之前current($arr)的值是false,而赋值之后current($arr)的值变成了1,说明赋值 之后$arr的数组指针被重置了,指向了数组的第一个元素。current($arr1)的值为false,说明赋值之后$arr1让然保留了赋值之 前$arr的数组指针指向的元素。

不知道描述清楚没有,还是将工作中问题简化一下,用下面代码说明一下吧。

<?php
          $arr = array('var1'=>1,'var2'=>2,'var3'=>3,'var4'=>4,'var5'=>5);
          while( list($key,$value) = each($arr) )
          {
               $$key = $value;
         }
         //下面这一步操作很关键,问题就出在这里,遍历完之后,对数组添加一个值。
         $arr['var6'] = 6;
        
        func($arr);
       
       function func($arrtmp)
       {
              while(list($key,$value) = each($arrtmp) )
              {
                     $$key = $value;
              }
              var_dump($var1);
              var_dump($var2);
              var_dump($var3);
              var_dump($var4);
              var_dump($var5);
              var_dump($var6);
       }
?>


输出结果:NULL NULL NULL NULL NULL int(6).

 

[!--infotagslink--]

相关文章

  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • c#的异或运算符介绍

    这篇文章介绍了c#的异或运算符,有需要的朋友可以参考一下...2020-06-25
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • 轻松学习C#的运算符

    轻松学习C#的运算符,对C#的运算符感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的运算符。...2020-06-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • C#中38个常用运算符的优先级的划分和理解

    这只我自己在学C#中的一些总结,其中对于各级的划分方式、各操作符的优先级的理解并不见得正确,只是自己的看法,拿出来与大家分享...2020-06-25
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • R语言运算符知识点讲解

    在本篇文章里小编给大家分享了一篇关于R语言运算符知识点讲解内容,有兴趣的朋友们可以参考下。...2021-05-06
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • C++编程中的或||、与&&、非!逻辑运算符基本用法整理

    这篇文章主要介绍了C++中的或||、与&&、非!逻辑运算符基本用法整理,是C++入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • JS不要再到处使用绝对等于运算符了

    这篇文章主要介绍了JS不要再到处使用绝对等于运算符了,对此感兴趣的同学,可以参考下...2021-05-01
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • 谈谈PHP中相对路径的问题与绝对路径的使用

    经常看到有人踩在了PHP路径的坑上面了,感觉有必要来说说PHP中相对路径的一些坑,以及PHP中绝对路径的使用,下面一起来看看。 ...2016-08-24
  • C#编程自学之运算符和表达式

    这篇文章主要介绍了C#运算符和表达式,这是自学C#编程的第五篇,希望对大家的学习有所帮助。...2020-06-25