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

栏目: PHP · 发布时间: 5年前

一、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.'<br />';
}
//&是取地址运算符,$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.'<br />';
}
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实现)。

解决方案

代码:

<?php
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<$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函数反转:'.'<br />';
echo $str1."->".strrev($str1)."<br>";
echo $str2."->".strrev($str2)."<br>";
echo $str3."->".strrev($str3)."<br>";
echo $str4."->".strrev($str4)."<br>";
echo '<br />';
echo $str1."->".str_rev_gb($str1)."<br>";
echo $str2."->".str_rev_gb($str2)."<br>";
echo $str3."->".str_rev_gb($str3)."<br>";
echo $str4."->".str_rev_gb($str4)."<br>";

运行结果:

直接用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 检测变量是否为数字或数字字符串;

警告: 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'


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming in Haskell

Programming in Haskell

Graham Hutton / Cambridge University Press / 2007-1-18 / GBP 34.99

Haskell is one of the leading languages for teaching functional programming, enabling students to write simpler and cleaner code, and to learn how to structure and reason about programs. This introduc......一起来看看 《Programming in Haskell》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具