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.'<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 檢測變量是否爲數字或數字字符串;
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'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章