php面試常問方法彙總


global定義的全局常量和$GLOBALS的區別

$GLOBALS(超全局變量) — 引用全局作用域中可用的全部變量, 一個包含了全部變量的全局組合數組。變量的名字就是數組的鍵

<?php
function test() {
 $foo = "local variable";
echo 'GLOBALS: ' . $GLOBALS["foo"] . "\n";
echo '$foo in current scope: ' . $foo . "\n";
}
$foo = "Example content";
test();
?>
//結果
GLOBALS:Example content
$foo in current scope:local variable

global的作用是定義全局變量,但是這個全局變量不是應用於整個網站,而是應用於當前頁面,包括include或require的所有文件

使用關鍵字“global”你就可以把全局數據導入到一個函數的局部範圍內

<?php
$a = 1;
$b = 2;
function Sum()
{
    global $a, $b; //如果沒有全局變量global在方法內是不能獲得$a,$b值的
    $b = $a + $b;
}
Sum();
echo $b;
?>
//結果
3

在函數體內定義的global變量,函數體外可以使用,在函數體外定義的global變量不能在函數體內使用

<?php
global $a;
$a=123; //必須分開賦值
function f() {
echo $a; //錯誤
}


//再看看下面一例
function f() {
 global $a;
 $a=123;
}
f();
echo $a; //正確,可以使用

const 定義的常量和define()定義的常量的區別

1.const用於類成員變量的定義,一經定義,不可修改。define不可以用於類成員變量的定義,可用於全局常量。

2.const可在類中使用,define不能(一般是define在類外定義常量,const在類內定義常量)

3.const不能再條件語句中定義常量

<?php
if (...){const FOO = 'BAR';    // 無效的invalid
}if (...) {
define('FOO', 'BAR'); // 有效的valid
}
?>

4.const採用普通的常量名稱,define可以採用表達式作爲名稱

<?php
const  FOO = 'BAR';
for ($i = 0; $i < 32; ++$i) {
define('BIT_' . $i, 1 << $i);
}
?>

5.const只能接受靜態的標量,而define可以採用任何表達式

<?php
const BIT_5 = 1 << 5;    // 無效的invalid
define('BIT_5', 1 << 5); // 有效的valid
?>

6.const定義的常量時大小寫敏感,而define可以通過第三個參數(爲true表示大小寫不敏感)來指定大小寫是否敏感

<?php
define('FOO', 'BAR', true);
echo FOO; // BAR
echo foo; // BAR
?>

7.const是語言結構,define是函數,const更快

PHP排序函數

  • sort() 函數用於對數組單元從低到高進行排序。

  • rsort() 函數用於對數組單元從高到低進行排序。

  • asort() 函數用於對數組單元從低到高進行排序並保持索引關係。

  • arsort() 函數用於對數組單元從高到低進行排序並保持索引關係。

  • ksort() 函數用於對數組單元按照鍵名從低到高進行排序。

  • krsort() 函數用於對數組單元按照鍵名從高到低進行排序。

參考文章

array_multisort:對列表型二維數組排序

 $data = array();
        $data[] = array('volume' => 67, 'edition' => 2);
        $data[] = array('volume' => 86, 'edition' => 1);
        $data[] = array('volume' => 85, 'edition' => 6);
        $data[] = array('volume' => 98, 'edition' => 2);
        $data[] = array('volume' => 86, 'edition' => 6);
        $data[] = array('volume' => 67, 'edition' => 7);
        $volume = array_column($data,'volume');
        $edition = array_column($data,'edition');
        //按照volume升序排
        array_multisort($volume,SORT_ASC,$data);


        //按照volume升序排,volume一樣就按照edition降序排
        //array_multisort($volume,SORT_ASC,$edition,SORT_DESC,$data);
        print_r($data);

str_repeat

str_repeat() 函數把字符串重複指定的次數。

echo str_repeat("Shanghai",2);
//結果:ShanghaiShanghai

strstr

搜索字符串在另一字符串中的第一次出現

查找 "Shanghai" 在 "I loveShanghai! and Shanghai" 中的第一次出現,並返回字符串的剩餘部分【包含第二個參數本身】

echo strstr("I loveShanghai! and Shanghai","Shanghai");//Shanghai! and Shanghai

第三個參數默認false,如果設置爲 "true",它將返回 第二個參數第一次出現之前的字符串部分【不包含第二個參數本身】

echo strstr("I loveShanghai! and Shanghai","Shanghai",true);//I love

該函數對大小寫敏感。如需進行不區分大小寫的搜索,請使用 stristr() 函數


array_filter

用回調函數過濾數組中的單元(文檔)

大部分可以用來過濾數組空的元素

$data = [1,0,3,false,'',null,"tom",'0'];
print_r(array_filter($data));
//結果
Array
(
    [0] => 1
    [2] => 3
    [6] => tom
)

有回調函數的時候(該函數把輸入數組中的每個鍵值傳給回調函數。如果回調函數返回 true,則把輸入數組中的當前鍵值返回結果數組中,如果是false就不返回。數組鍵名保持不變,原數組不變):



$arr = ['a','b',1,2,3];
$new_arr = array_filter($arr,function($val){
     return is_numeric($val); //過濾不是數字的值,is_numeric返回bool值
});
print_r($new_arr);
//結果:
Array
(
    [2] => 1
    [3] => 2
    [4] => 3
)

array_pop

彈出數組最後一個單元(出棧),原來的數據中將不不再有最後一個值了。

$data = [1, 2, 3, 4];
print_r(array_pop($data));
//結果:
4
$data = [
            [
                'name' => 'xxx',
                'age' => 12
            ],
            [
                'name' => 'yyy',
                'age' => 20
            ],
            [
                'name' => 'zzz',
                'age' => 30
            ]
        ];
print_r(array_pop($data));
//結果:
Array
(
    [name] => zzz
    [age] => 30
)

array_shift

第一個單元移出並作爲結果返回,將 array 的長度減一併將所有其它單元向前移動一位。所有的數字鍵名將改爲從零開始計數,文字鍵名將不變。

$data = [1, 2, 3, 4];
print_r(array_shift($data));
print_r($data);
//結果:
1
Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)
$data = [
            [
                'name' => 'xxx',
                'age' => 12
            ],
            [
                'name' => 'yyy',
                'age' => 20
            ],
            [
                'name' => 'zzz',
                'age' => 30
            ]
        ];


        print_r(array_shift($data));
        print_r($data);
//結果:
Array
(
    [name] => xxx
    [age] => 12
)
Array
(
    [0] => Array
        (
            [name] => yyy
            [age] => 20
        )


    [1] => Array
        (
            [name] => zzz
            [age] => 30
        )


)

array_slice

截取數組

$data = [1, 2, 3, 4];
print_r(array_slice($data,1,2));
print_r(array_slice($data,-1,1));
//結果:
Array
(
    [0] => 2
    [1] => 3
)
Array
(
    [0] => 4
)
$data = [
            [
                'name' => 'xxx',
                'age' => 12
            ],
            [
                'name' => 'yyy',
                'age' => 20
            ],
            [
                'name' => 'zzz',
                'age' => 30
            ]
        ];
        print_r(array_slice($data,1,2));
        print_r(array_slice($data,-1,1));
//結果:
Array
(
    [0] => Array
        (
            [name] => yyy
            [age] => 20
        )


    [1] => Array
        (
            [name] => zzz
            [age] => 30
        )


)
Array
(
    [0] => Array
        (
            [name] => zzz
            [age] => 30
        )


)

array_map

爲數組的每個元素執行回調函數,返回一個新的數組

<?php
$arr = [1,3,5];
$res = array_map(function($val){
    return $val*10; //每個值乘10
},$arr);
print_r($res);
print_r($arr);
//結果:
Array
(
    [0] => 10
    [1] => 30
    [2] => 50
)
Array
(
    [0] => 1
    [1] => 3
    [2] => 5
)

多個數組的時候:

$arr1 = [1,2,3,4,5];
$arr2 = [6,7,8,9,10];
$res = array_map(function($val1,$val2){
    return $val1 + $val2;
},$arr1,$arr2);
print_r($res);
//結果:
Array
(
    [0] => 7
    [1] => 9
    [2] => 11
    [3] => 13
    [4] => 15
)

array_walk

使用用戶自定義函數對數組中的每個元素做回調處理,成功時返回 TRUE, 或者在失敗時返回 FALSE

<?php
//將數組中的元素用於某種操作
$arr = ['a','b','c'];
array_walk($arr,function(&$val,$key){
    $val .= $val;
});
print_r($arr);
//結果:
Array
(
    [0] => aa
    [1] => bb
    [2] => cc
)

異同點

  • array_filter() 重點在於過濾(而不是新增)某個元素,當你處理到一個元素時,返回過濾後的數組  

  • array_map() 重點在於遍歷一個數組或多個數組的元素,返回一個新的數組  

  • array_walk() 重點在於遍歷數組進行某種操作  

  • array_filter() 和 array_walk()對一個數組進行操作,數組參數在前,函數參數在後  array_map() 可以處理多個數組,因此函數參數在前,數組參數在後,可以根據實際情況放入多個數組參數

ceil()

ceil函數是向上取整函數,裏面參數是float,返回值也是float

echo ceil(4.1); // 5
echo ceil(9.999); // 10
echo ceil(5);  //5
echo ceil(-1.2); // -1
echo ceil(-1); // -1

floor()

floor函數是向下取整,裏面參數是float,返回值也是float

echo floor(4.1);  // 4
echo floor(9.999);  // 9
echo floor(5);  //5
echo floor(-1.2); // -2
echo floor(-1); // -1

round()

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
返回將 val 根據指定精度 precision(十進制小數點後數字的數目)進行四捨五入的結果。precision 也可以是負數或零(默認值)。返回值是float型

echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06

round 的參數一是數據源,參數二是要保留的小數位而且之後一位(比如你輸入2那麼第3爲是之後一位)被四捨五入,當他是負數的時候,從數據源最後一位開始往前數相應的長度制0並將最後一位四捨五入比如round(123456,-2) 就是123456從6開始往前數兩位都變成零,並且最後一位5(從後往前數第一位是6最後一位是5)被四捨五入,輸出123500。當第二個參數爲0時候,結果相當於對數字取整並四捨五入。

還有使用sprintf對數據四捨五入:

$n=0.1265489;
echo sprintf("%.2f", $n); // 0.13

$_GET

http://localhost/api?a=1+2&b=1%3&c=yy3#4&d=6@22

echo $_GET["a"]; //1 2
echo $_GET["b"]; //1%3
echo $_GET["c"]; //yy3
echo $_GET["d"]; //報錯:Undefined index: d

$_GET會把'#'字符後面的過濾掉(所以上面報錯不識別d),‘+’會轉爲空

PHP兩種數組合並方式區別示例

對於重複的字符串鍵,+操作後,前面數組的鍵值會覆蓋後面的

對於重複的數字鍵,+操作後,前面數組的鍵值會覆蓋後面的,保留之前數字鍵

對於重複的字符串鍵,array_merge後,後面數組的鍵值會覆蓋前面的

對於重複的數字鍵,array_merge後,重排數字鍵,不會覆蓋

參考文章

PHP ...$arg使用

在PHP 5.6及更高版本中,參數列表可能包含...標記,表示該函數接受可變數量的參數。參數將作爲數組傳遞給給定變量

<?php
//聲明時使用
function sum(...$numbers) {
    //var_dump($numbers); //$numbers是個數組值爲:[1,2,3,4]
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}
//10
echo sum(1, 2, 3, 4);
?>
<?php
//調用時使用
function add($a, $b) {
    var_dump($a);//int(1)
    var_dump($b); //int(2)
    return $a + $b;
}
//3
echo add(...[1, 2])."\n";
//3
$arr = [1, 2];
echo add(...$arr);//$arr的值會循環賦值給add裏面的參數($a爲1,$b爲2)
?>

參考文章

獲取每個月的第一天和最後一天

echo date("Y-m-d H:i:s",strtotime('first day of today')); //2020-04-01 00:00:00
echo date("Y-m-d H:i:s",strtotime('last day of 23:59'));  //2020-04-30 23:59:00
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章