资讯专栏INFORMATION COLUMN

PHP细节:foreach、(汉子)字符串反转、isset,empty用法区别以及0、‘’、null

孙淑建 / 2458人阅读

摘要:规定要反转的字符串。参考文档实现字符串翻转包含中文汉字参考处理汉字官方文档函数最下面给出了支持的方案三用法区别以及之间关系用法如果是非空或非零的值,则返回。若想检测常量是否已设置,可使用函数。

一、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同样会改变,因为是一个地址

参考文档1:对数组两次foreach的使用陷阱

PHP foreach原理详解

二、(汉子)字符串反转 包含汉字字符串乱码

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

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

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

解决方案

代码:

 国 [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<$l;$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"

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/dev...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30979.html

相关文章

  • Yii2中的依赖注入

    摘要:构造器注入实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。 基本概念 1.依赖倒置(反转)原则(DIP):一种软件架构设计的原则(抽象概念,是一种思想)在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于...

    harriszh 评论0 收藏0
  • PHPisset,empty,is_null用法区别

    摘要:用法如果是非空或非零的值,则返回。如果已经使用释放了一个变量之后,它将不再是。若使用测试一个被设置成的变量,将返回。同时要注意的是一个字节并不等同于的常数。 1.empty用法bool empty ( mixed var)如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,、0、0、NULL、FALSE、array()、var $var; 以及没有任何属性的...

    fou7 评论0 收藏0
  • [PHP]一张图片彻底弄清isset empty函数区别!!!

    摘要:如果还有人问你两者区别,马上甩出这种图有兴趣可以往下阅读,官方手册给出的例子手册这是一张将区别的表格,从表格中我们可以发现返回值等同返回值等同。 简单谈一下isset和empty的区别? 如果你是在面试,碰巧面试官提了这个问题。你可以这样回答: 如果变量值为0、空字符串、空数组等等,empty认为它是空的,而isset认为它不是空的。 如果变量不存在,isset和empty都认为它是...

    venmos 评论0 收藏0
  • 十个 PHP 开发者最容易犯的错误

    摘要:这种行为比最初出现的问题更为棘手,同时也是一种常见的错误源。这意味着这个数组的一份拷贝将会被返回,因此被调函数与调用者所访问的数组并不是同样的数组实例。 showImg(https://segmentfault.com/img/bV7reP?w=620&h=620); PHP 语言让 WEB 端程序设计变得简单,这也是它能流行起来的原因。但也是因为它的简单,PHP 也慢慢发展成一个相对...

    fireflow 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<