共计 1942 个字符,预计需要花费 5 分钟才能阅读完成。
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)
}
发现数组的键只有 0
、2
、5
,其余的键被移除了。
如果这时候用 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)
*/
正文完