php的foreach乱码,PHP细节:foreach、(汉子)字符串反转、isset,empty用法区别以及0、‘’、null之间关系...

一、foreach

第一题:

//1.for循环执行几次

//for($i=0;$i=1;$i++){

// echo $i;

//}

$i==1条件很成立,死循环

for($i=0;$i==1;$i++){

echo $i;

}

由于条件$i==1条件不成立,所以for循环不执行

第二题:

class SomeClass

{

private $properties = [];

public $j;

public function __set($name, $value)

{

$this->properties[$name] = $value;

}

public function __get($name)

{

return $this->properties[$name];

}

}

$obj = new SomeClass();

$obj->name = 'phpgod';

$obj->age = 2;

$obj->gender = 'male';

//$obj->j=0;

$l = null;

var_dump($obj->name);

//output:string(6) "phpgod"

var_dump($obj->j); //null

var_dump(isset($obj->j));//由于$j没有赋值,为空null,所以返回false

//var_dump($obj->properties);

var_dump(isset($obj->name));//私有或者保护属性不能被调用,false

//output:bool(false),你的答案对了吗?为什么

第三题:foreach和取地址运算符&

$arr = [1,2,3,4,5,8];

foreach($arr as &$v) {

//nothing todo.

echo $v.'
';

}

//&是取地址运算符,$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址

var_dump($arr); //1,2,3,4,5,8

foreach($arr as &$v) {

//nothing todo.

var_dump($arr);

echo $v.'
';

}

var_export($arr); //1,2,3,4,5,5

&是取地址运算符,$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址

二、(汉子)字符串反转

包含汉字字符串乱码

PHP面试题,题目很短,也很常见,但更容易出错,题目如下

如何实现字符串翻转?

第一反应,当然是strrev函数啦,这么容易的题目还放在面试里考,真不嫌麻烦啊?但是看了网上的答案后,发现自己错了~~~

strrev函数对英文很好用,直接可以实现字符串翻转,但是面对中文呢?肯定都是乱码,对于这样的问题有很多,比如strstr,substr等函数都是这样的。还好PHP提供了mb_类的函数实现不同编码、不同语言之间的相互转换等操作。下面是我写的PHP字符串翻转函数(mb_类的函数需要开启一个mb_string实现)。

解决方案

代码:

header("content-type:text/html;charset=utf-8");

/**

strrev() 函数反转字符串。

语法

strrev(string)

参数 描述

string 必需。规定要反转的字符串。

*/

/**

此函数的作用是反转中文字符串

mb_strlen() 获取字符的长度

mb_substr() 获取字符的单个元素

krsort() 按照键值逆序排序数组,对关联数组按照键名进行降序排序

Array ( [8] => 国 [7] => 中 [6] => h [5] => s [4] => i [3] => l [2] => g [1] => n [0] => E ) English中国->国中hsilgnE

(ksort()对关联数组按照键名进行升序排序)

implode() 将数组拼接为字符串

explode() 使用字符串分隔字符串

*/

function str_rev_gb($str){

//判断输入的是不是utf8类型的字符,否则退出

if(!is_string($str)||!mb_check_encoding($str,'UTF-8')){

exit("输入类型不是UTF8类型的字符串");

}

$array=array();

//将字符串存入数组

$l=mb_strlen($str,'UTF-8');//在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算

for($i=0;$i

$array[]=mb_substr($str,$i,1,'UTF-8');

}

//反转字符串

krsort($array);

//拼接字符串

$string=implode($array);

return $string;

}

$str1 = "Englist";

$str2 = "English中国";

$str3 = "Eng中lish国";

$str4 = "中华人民共和国";

echo '直接用PHP自带strrev函数反转:'.'
';

echo $str1."->".strrev($str1)."
";

echo $str2."->".strrev($str2)."
";

echo $str3."->".strrev($str3)."
";

echo $str4."->".strrev($str4)."
";

echo '
';

echo $str1."->".str_rev_gb($str1)."
";

echo $str2."->".str_rev_gb($str2)."
";

echo $str3."->".str_rev_gb($str3)."
";

echo $str4."->".str_rev_gb($str4)."
";

运行结果:

直接用PHP自带strrev函数反转:

Englist->tsilgnE

English中国->��學�hsilgnE

Eng中lish国->���hsil���gnE

中华人民共和国->��匒居呰溺䎍學�

Englist->tsilgnE

English中国->国中hsilgnE

Eng中lish国->国hsil中gnE

中华人民共和国->国和共民人华中

需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

参考文档:PHP 实现字符串翻转(包含中文汉字)

参考:

// 处理汉字

function strReverseMb($str) {

$revStr = '';

if (is_string($str) && mb_check_encoding($str, "UTF-8")) {

$len = mb_strlen($str);

for ($i = $len-1; $i>=0; $i--) {

$revStr .= mb_substr($str, $i, 1, "UTF-8");

}

}

return $revStr;

}

php官方文档strrev函数最下面给出了支持utf-8的方案:

function utf8_strrev($str){

preg_match_all('/./us', $str, $ar);

return join('',array_reverse($ar[0]));

}

三、isset、empty、if用法区别以及0、‘’、null之间关系

3.1 empty用法

bool empty ( mixed var)

如果 var 是非空或非零的值,则 empty() 返回 FALSE。

换句话说,""、0、"0"、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE

3.2 isset()

isset -- 检测变量是否设置

描述

bool isset ( mixed var [, mixed var [, ...]])

如果 var 存在则返回 TRUE,否则返回 FALSE。

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("0")并不等同于 PHP 的 NULL 常数。

注意:如果变量不存在(或者unset()释放一个变量后),isset()和empty()都不会报错;is_null(),is_numeric(),if会报错

is_numeric 检测变量是否为数字或数字字符串;

is_null正好是isset的反结果,我们可以把它看成是!isset,是isset的一个逆操作。

警告: isset() 只能用于变量,因为传递任何其它参数都将造成解析错误。若想检测常量是否已设置,可使用 defined()函数。

用法:注意defined(""),如果没有双引号,则会警告:undefined constant website

if(defined("website")){

echo "true";

}else{

echo "false";

}

3.3 0、‘’、null之间相等关系

if('' == null && '' == 0 && null == 0 && 0 =='0') echo 'if';

if('' == '0' || null == '0' ) echo 'if2';

结论:'' ,null , 0 ,'0'互相相等;'',null不等于'0'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值