2022年7月18日

技术细节之continue、查问相干以及array_unique

(一)Q1:continue 前面的语句是否会执行?

答案:不会

例子:拆散区间 [0-9] 之内的奇数与偶数

<?php// 解决 7月18日的问题$even = $odd = [];for($i=0;$i<9;$i++){    if($i % 2 == 0){        $even[] = $i;         continue;    }    $odd[] = $i; }var_dump($even);        // [0=>0,1=>2,2=>4,3=>6,4=>8]var_dump($odd);         // [0=>1,1=>3,2=>5,3=>7]// 调整一下语句 $even[] = $i 的地位,放到 continue 之后:$even = $odd = [];for($i=0;$i<9;$i++){    if($i % 2 == 0){        continue;        $even[] = $i;     }    $odd[] = $i; }var_dump($even);        // []var_dump($odd);         // [0=>1,1=>3,2=>5,3=>7]

剖析:把 $even[] = $i 的地位,放到 continue 之后,存储偶数的数组就为空。即continue 之后的语句不会执行。

(二)Q2:查问相干
如果某条查问语句获取到了数据,然而有些字段的值为空,该用哪个函数去判断?

答案:用 empty

try{    $pdo = new PDO("mysql:host=localhost;dbname=test;",'root','root');    $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);    $sql = "SELECT * FROM user WHERE id = ?";    $stmt = $pdo->prepare($sql);    $data = [];    if($stmt->execute([21])){        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);    }    // var_dump($data);     // 二维数组 [0=>['id'=21,'name'=>'','age'=>0]]    $re = [];    foreach($data[0] as $v){        if(!empty($v)){            $re[] = $v;        }    }    var_dump($re);          // [0=>'21']}catch(PDOException $e){    echo $e->getMessage();}

如果某个字段未设置值,那么查问返回的后果中,该字段的值为空字符串

须要留神的是:

  • 如果是通过 PDOStament::fetchAll() 获取后果集中的数据,失去的是一个二维数组;
  • empty(0) 的后果为 true

除此之外:

bool PDOStatement::execute ([ array $input_parameters ] )

执行一条预处理语句的返回值为布尔值。

(三)Q3:array_unique
应用 array_unique 函数去重之后,为什么会呈现有些键不存在的状况

答案:在去重的时候,反复的值(非第一个)会被移除,同时对应的键也会被移除

用法:

array_unique() 函数用于移除数组中反复的值。如果两个或更多个数组值雷同,只保留第一个值,其余的值被移除。

技术细节:
去重,如果值反复,则保留第一个值,其余的值会被移除,并且对应的键也会被移除。

例子:

$arr = [1,1,"",1,"",2];var_dump(array_unique($arr));// 后果:array(3) {  [0]=>  int(1)  [2]=>  string(0) ""  [5]=>  int(2)}

发现数组的键只有 025,其余的键被移除了。

如果这时候用 for 去遍历这个数组,那么就会报错

$arr = [1,1,"",1,"",2];$uniques = array_unique($arr);for($i=0,$total=count($uniques);$i<$total;$i++){    echo $uniques[$i]."\n";}// PHP Notice:  Undefined offset: 1 in D:\PhpStudy\PHPTutorial\WWW\index\Questions\2022年7月\7-18.php

解决办法:用 array_values 函数,获取数组所有的值,并且从新生成索引:

$arr = [1,1,"",1,"",2];$uniques = array_values(array_unique($arr));for($i=0,$total=count($uniques);$i<$total;$i++){    var_dump($uniques[$i]);}/*    int(1)    string(0) ""    int(2)*/