PHP 判断二维数组中是否含有某个值

主要是因为用 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; 

/*

数组的元素个数在五千时,这两个方法的执行效率一样,
但是数组元素个数在一万时,下面的方法效率比上面方法的效率快了一倍左右。

*/



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值