主要是因为用 mysqli_fetch_all() 这函数返回的数组是数字索引的二维数组,有时候我们需要判断一个主键是否在这个二维数组中就会遇到一些麻烦,常见的做法就是写循环判断,但是如果需要判断多次的情况下,我们循环这么多次会大大降低脚本的性能,我们应该要如何改进?思路就是把子数组中的键值作为数组索引,然后直接用 if 或者 array_key_exists() 就可以判断了。
<?php
//数据库就不创建了,直接代码模拟。
$data = [
0 => [
'id' => 5698,
'first_name' => 'Bill',
'last_name' => 'Gates',
],
1 => [
'id' => 4767,
'first_name' => 'Steve',
'last_name' => 'Jobs',
],
2 => [
'id' => 3809,
'first_name' => 'Mark',
'last_name' => 'Zuckerberg',
],
];
//我们用 mysqli_fetch_all() 函数以后肯定会得到类似这样的数值索引二维函数。子数组先以关联数组演示。
//方法一
$arr = [];
foreach( $data as $key => $value){
$arr[$data[$key]['id']] = $value;
}
echo '<pre>';
print_r($arr);
echo '<pre/>';
/*
输出数组
Array
(
[5698] => Array
(
[id] => 5698
[first_name] => Bill
[last_name] => Gates
)
[4767] => Array
(
[id] => 4767
[first_name] => Steve
[last_name] => Jobs
)
[3809] => Array
(
[id] => 3809
[first_name] => Mark
[last_name] => Zuckerberg
)
)
输出以ID为索引的二维数组成功。
*/
/*
方法二
利用 array_column() 函数
该函数返回输入的多维数组中所有子数组中的某个索引的值组成的数组。
输入的必须是多维数组(关联数组和索引数组都可以),不然返回数组为空数组。
子数组中的索引可以是字符串索引也可以是数字索引。
第二个参数也可以是 NULL,此时将返回子数组中所有元素(配合 index_key 参数来重置数组键的时候,非常有用)。
第三个参数可以规定该子数组某个索引(键名)的键值成为返回数组中的键值对的键名。
返回数组的键值为输入的多维数组中子数组中的某个键名的键值,返回数组的键名按以下规则
1.如果有第三个参数,则按第三个参数规定的值。
2.如果第三个参数为空,返回数组的键名则是以 0 开始 的数字索引。
*/
$arr = [];
$arr = array_column($data,null,'id');
//第二个参数设置为null,这样返回数组的键值为子数组的所有元素。
//第三个参数设置为id,这样返回数组的键名为子数组中id索引的键值。
echo '<pre>';
print_r($arr);
echo '<pre/>';
/*
输出数组
Array
(
[5698] => Array
(
[id] => 5698
[first_name] => Bill
[last_name] => Gates
)
[4767] => Array
(
[id] => 4767
[first_name] => Steve
[last_name] => Jobs
)
[3809] => Array
(
[id] => 3809
[first_name] => Mark
[last_name] => Zuckerberg
)
)
输出以ID为索引的二维数组成功。
*/
顺便测试了一下这两个方法的效率。
<?php
$data = [];
for($n = 0;$n<100000;$n++)
{
$data [] = [
'id' => md5(uniqid(mt_rand(), true)), //生成唯一id
'first_name' => 'Mark',
'last_name' => 'Zuckerberg',
];
}
$t1 = microtime(true);
foreach( $data as $key => $value){
$arr[$data[$key]['id']] = $value;
}
//$arr = array_column($data,null,'id');
$t2 = microtime(true);
echo $t2-$t1;
/*
数组的元素个数在五千时,这两个方法的执行效率一样,
但是数组元素个数在一万时,下面的方法效率比上面方法的效率快了一倍左右。
*/