一、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同樣會改變,因爲是一個地址
二、(漢子)字符串反轉
包含漢字字符串亂碼
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'